Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 18
  1. #1
    Tham gia
    03-05-2010
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts

    Cần chú ý ! 1 câu hỏi nhỏ cho bài quản lý nhân sự

    Xét hệ thống quản lý nhân sự của một công ty
    EMPLOYMENT với các bảng – quan hệ như sau:

    DEPARTMENT, EMPLOYEE, JOBS, EMPLHIST

    EMPLOYEE: Empno,Name,Job,Salary,Comm,Deptno,***
    (MãNV,Tên,Mã chức vụ, Lương,Hoa hồng,Mã phòng,Giới tính)

    DEPARTMENT: DeptNo,DeptName,Loc,Mgr,Exp_budg,Rev_budg
    (Mã phòng,Tên phòng,Vị trí,Mã trưởng phòng,Ngân sách,Doanh thu)

    JOBS: Job,JobName,MinSalary,MaxSalary,MgrFlag
    (Mã Chứ vụ,Tên chức vụ,Lương tối thiểu,Lương tối đa,Có thể tiến cử
    thành lãnh đạo không?)

    EMPLHIST:EmpNo,Seq,Date_Beg,Date_End,Salary,FrJob, ToJob,
    Promo,FrDept,ToDept
    (MãNV,STTlần thay đổi,Ngày bắt đầu,Ngày kết thúc,Lương,chức vụ cũ,
    chức vụ mới,còn thắng tiến nữa không, Phòng ban cũ, Phòng ban mới)

    Câu hỏi đặt ra :
    Cho biết các nhân viên có mức lương cao nhất
    (tương tự: lương thấp nhất, và lương trung bình)
    của các phòng .

    Nhờ các anh , chị giúp giùm em câu này !!!
    Quote Quote

  2. #2
    Tham gia
    04-01-2008
    Bài viết
    17
    Like
    0
    Thanked 0 Times in 0 Posts
    Mức lương cao nhất bạn dùng max, trung bình avg, min là thấp nhất bạn ah

  3. #3
    Tham gia
    03-05-2010
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts
    Không có đơn giản thế đâu bạn chinhcode ơi !!!!

    Bạn có thể đưa ra cái code thử xem sẽ biết nó không có phải đơn giản như thế đâu .
    Làm sao 1 lúc in ra tên người có mức lương thấp nhất , cao nhất của "các phòng" chứ không phải chỉ có 1 phòng đâu .
    Cái cốt lỏi là ở chỗ đó đó !

  4. #4
    Tham gia
    24-10-2008
    Bài viết
    126
    Like
    0
    Thanked 4 Times in 4 Posts
    Quote Được gửi bởi thienthantudo View Post
    Xét hệ thống quản lý nhân sự của một công ty
    EMPLOYMENT với các bảng – quan hệ như sau:

    DEPARTMENT, EMPLOYEE, JOBS, EMPLHIST

    EMPLOYEE: Empno,Name,Job,Salary,Comm,Deptno,***
    (MãNV,Tên,Mã chức vụ, Lương,Hoa hồng,Mã phòng,Giới tính)

    DEPARTMENT: DeptNo,DeptName,Loc,Mgr,Exp_budg,Rev_budg
    (Mã phòng,Tên phòng,Vị trí,Mã trưởng phòng,Ngân sách,Doanh thu)

    JOBS: Job,JobName,MinSalary,MaxSalary,MgrFlag
    (Mã Chứ vụ,Tên chức vụ,Lương tối thiểu,Lương tối đa,Có thể tiến cử
    thành lãnh đạo không?)

    EMPLHIST:EmpNo,Seq,Date_Beg,Date_End,Salary,FrJob, ToJob,
    Promo,FrDept,ToDept
    (MãNV,STTlần thay đổi,Ngày bắt đầu,Ngày kết thúc,Lương,chức vụ cũ,
    chức vụ mới,còn thắng tiến nữa không, Phòng ban cũ, Phòng ban mới)

    Câu hỏi đặt ra :
    Cho biết các nhân viên có mức lương cao nhất
    (tương tự: lương thấp nhất, và lương trung bình)
    của các phòng .

    Nhờ các anh , chị giúp giùm em câu này !!!
    thí dụ trên 1 bảng EMPLOYEE:
    bạn phải xác định lấy bao nhiêu người kuơơng cao nhất, sắp xếp theo cột tiền từ lớn đến nhỏ. thí dụ
    select TOP 10 ten,luong from EMPLOYEE into cursor caonhat_10 order by luong desc
    trong đó 10 là 10 ngưới có lương cao nhat ta chỉ thay đổi 20 hay 30 là được.
    nếu tìm thấp nhất thì cũng cú pháp đó bạn ORDER BY ASC thì sẽ được số người thấp nhất

  5. #5
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Dùng một subquery để tìm max/min trong phòng. Dùng query bọc để liệt kê danh sách NV có mức lương bằng số max/min đó.
    Trung bình là cái gì? Bạn không thể tìm được NV có số lương = (a+b+c+...)/n Theo toán học thống kê người ta chỉ tìm NV có mức lương nằm giữa (dưới n/2 và trên n/2) hoặc tìm NV có sô lương gần nhất với sô trung bình.

    Đầu tiên hết, bạn phải xác định là lương lấy từ đâu ra?
    Employee.Lương, Employee.Lương+HoaHồng, Job.LuongToiThieu, Job.LuongToiDa, EplHist.Luong
    Được sửa bởi megaownage lúc 08:52 ngày 04-05-2010

  6. #6
    Tham gia
    03-05-2010
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts
    Hic !
    Làm như thế là đâu có đúng như trong đề bài đâu bạn Luu_Luu

    Vì mỗi phòng có nhiều nhân viên . Trong bảng Employee thì là danh sách nhân viên chung .Nhân viên nào ứng với phòng đó .
    Nếu dùng lệnh top cho employee thì sắp theo lương như thế sẽ bỏ xót dữ liệu .
    thí dụ
    n_viên -- phòng -- lương
    nv1--10--400
    nv2--20--300
    nv3--10--500
    giả sử như làm TOP 2 thì chỉ ra 2 đứa trong phòng 10 vậy là không đúng yêu cầu bài .

    Yêu cầu bài là : tìm ra mỗi phòng tên nhân viên có mức lương cao nhất so với tất cả nhân viên trong phòng đó . Ở đây là rất nhiều phòng .
    Chứ không phải là lấy ra nhân viên có lương lớn nhất của cả công ty mà không phân biệt phòng nào đâu bạn .

    Còn nếu bạn nói tăng TOP 10 20 30 thì đây là điều hạn chế vì dữ liệu rất nhiều thì sao .
    Vả lại lấy ra toàn cùng 1 phòng thì sao !!!

    Bạn megaownage cũng hiểu nhầm đề bài rồi .

  7. #7
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Bạn hiểu nhầm câu hỏi của tôi thì đúng hơn.
    Cái bạn muốn là cái này:
    Phòng LCN NV
    abcde 20t ÔngBự
    fghijk 18t BàTo
    lmnop 30t ChủCả
    ... (xếp theo thứ tự tên phòng)

    Bài này là một bài căn bản của SQL, đã từng được hỏi và trả lời đầy đủ. Nếu bạn chịu khó tìm về các câu hỏi trước đây sẽ thấy. Những câu tôi dẫn ra trước đây là cốt gợi ý cho bạn những từ khóa chính để dễ search.

    Chỉ riêng câu tìm NV lương trung bình thì như tôi đã nói, không thể làm được vì nó không đúng với luật thống kê. Vua SQL cũng bó tay mà thôi. Thí dụ phòng A có:
    NV lương
    V 3t
    W 8t
    X 4t
    Y 5t
    Z 15t
    trung bình = (3+8+4+5+15)/5 = 7t -> không có NV nào cả!
    Vì vậy tôi mới gợi ý bạn, hoặc tìm NV có số lương gần TB nhất (W: 8t) hoặc NV có mức lương ở giữa (Y: 5t, dưới WZ và trên VX)

  8. #8
    Tham gia
    03-05-2010
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts
    Bạn nói hơi quá lời rồi bạn ơi !
    Làm gì mà Vua SQL pó tay . Chả nhẽ thầy của mình lại hơn ông vua đó .

    Vậy bạn nói như thế , bạn có thể gợi ý rõ hơn cho mình 1 tí không .

    Mình dùng nát cái subquery mà vẫn chưa ra .

  9. #9
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    hơi quá lời?
    Dữ liệu nằm trong CSDL, đã là trích dẫn dữ liệu thì trích gì lại không được? Không làm được là vì yêu cầu không chính xác. Ví dụ đã ra rõ ràng, không thể tìm được NV có mức lương BẰNG mức trung bình. Và đã có đề nghị dùng NV có mức lương GẦN NHẤT, hoặc Ở GIỮA. Nếu bạn muốn con số trung bình thì chỉ có thể liệt kê ra từng phòng với số lương trung bình mỗi phòng, không thể kê ra nhân viên. Bạn tìm sách giáo khoa thống kê nào cũng nói như tôi vậy thôi.
    Vua SQL không thể cãi lại định luật toán học.

    [=========> Bổ sung bài viết <=========]

    Câu query như thế này:
    (Đã có hỏi bạn muốn lấy Luong từ đâu? Đối với phân tích dữ liệu, phần quan trọng nhất là 'lấy dữ liệu nào và từ đâu ra', phần viết câu SQL để làm việc chỉ là phụ)

    Câu này đặt giả sử luong được lấy từ trường Luong trong bảng Employee

    select a.MaPhong, a.MaNV, a.Luong
    from EMPLOYEE a where a.Luong IN
    (select Max(Luong) From EMPLOYEE where MaPhong = a.MaPhong)

    Muốn tìm min thì đổi Max thành Min. Muốn in tên phòng thì đem nguyên câu join với bảng phòng.
    Như đã nói, đây là câu căn bản, đã có nhiều người giải trước rồi.
    Được sửa bởi megaownage lúc 08:52 ngày 07-05-2010 Reason: Bổ sung bài viết

  10. #10
    Tham gia
    03-05-2010
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts
    Không hiểu tại sao bạn cứ lập đi lập lại chuyện kì lạ này ?

    Đúng là lấy dữ liệu Luong trong bảng EMPLOYEE .

    Với câu subquery của bạn chỉ có thể tìm ra người có lương cao nhất của cả bảng EMPLOYEE (đã test).

    Mà mình đã nói rõ ràng là : Cần phải in ra tên của nhân viên có lương cao nhất của từng phòng ban .
    Ví dụ thế này:
    +Trong Bảng EMPLOYEE có tất cả là 5 phòng ban và 30 nhân viên.
    Phòng_ban--Nhân_viên--Lương
    1---------------A-----------3t
    1---------------B-----------0.5t
    1---------------J-----------2t
    5---------------R-----------8t
    4---------------Y-----------10t
    v.v.vvvvvvvvvv
    Giả sử thằng W là có lương cao nhất trong bảng EMPLOYEE. Thì theo code của bạn thì mình thấy đáp số là
    ra có duy nhất thằng Y (mình test rõ ràng)

    Nhưng trong khi mình
    Cần phải in ra
    Phòng ban---Tên_nhân_viên_có_lương_cao_nhất---Tên_Nhân_Viên_Có_Lương_Thấp_Nhất
    1----------------------------------A----------------------------------B
    2 ----------------------------------D----------------------------------F
    3----------------------------------H----------------------------------U
    4----------------------------------Y----------------------------------P
    5----------------------------------O----------------------------------T

    Rõ ràng là bạn vẫn hiểu lầm ý mình nói mà ???? (~_~)!

    Có gì mạo phạm xin bỏ qua ! Mình chỉ thảo luận thôi đừng nóng (^_^)
    Được sửa bởi thienthantudo lúc 22:10 ngày 07-05-2010

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •