Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Lọc ra các mặt hàng do nhân viên 'son' nhập - xuất!

  1. #1
    Ngày gia nhập
    12 2010
    Bài viết
    85

    Mặc định Lọc ra các mặt hàng do nhân viên 'son' nhập - xuất!

    - Mình có code sau:
    1.
    SELECT tennv,chitietphieunhap.Mahang ,tenhang,ngaynhap,chitietphieunhap.soluong,chitiet phieunhap.dongia
    FROM chitietphieunhap,phieunhap,hanghoa,nhanvien
    WHERE nhanvien.manv='son'
    and nhanvien.manv = phieunhap.manv
    and phieunhap.mapn = chitietphieunhap.mapn
    and chitietphieunhap.mahang = hanghoa.mahang
    --> Dùng để lọc ra các mặt hàng do nhân viên có mã 'son' nhập kho.

    2.
    SELECT tennv,chitietphieuxuat.Mahang ,tenhang,ngayxuat,chitietphieuxuat.soluong,chitiet phieuxuat.dongia
    FROM chitietphieuxuat,phieuxuat,hanghoa,nhanvien
    WHERE nhanvien.manv='son'
    and nhanvien.manv = phieuxuat.manv
    and phieuxuat.mapx = chitietphieuxuat.mapx
    and chitietphieuxuat.mahang = hanghoa.mahang
    --> Dùng để lọc ra các mặt hàng do nhân viên có mã 'son' xuất kho.

    Bây giờ làm thế nào để gọp 2 câu truy vấn này lại thành 1 để có thể lọc ra danh sách các mặt hàng do nhân viên '1' xuất, nhập kho?

    Các pro giúp mình với.
    Học hỏi - học hỏi - học hỏi tới cùng
    --> Học hỏi đến khi nào ra vấn đề thì học hỏi vấn đề khác
    và học hỏi - học hỏi - học hỏi đến
    .

  2. #2
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Chỉ cần xuất hoặc nhập hay phải có cả xuất lẫn nhập?

    vd nv '1' chỉ nhập mặt hàng 'x' nhưng không hề xuất thì có liệt kê ra không?

  3. #3
    Ngày gia nhập
    12 2010
    Bài viết
    85

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Chỉ cần xuất hoặc nhập hay phải có cả xuất lẫn nhập?

    vd nv '1' chỉ nhập mặt hàng 'x' nhưng không hề xuất thì có liệt kê ra không?
    Liệt kê tất cả luôn, như vậy mới khó. Ví dụ:
    nhân viên 1 xuất mặt hàng a
    nhân viên 2 xuất mặt hàng b nhập mặt hàng a
    nhân viên 3 xuất mặt hàng a nhập mặt hàng a
    nhân viên 4 nhập mặt hàng b.

    Nói chung là (xuất and nhập) or xuất or nhập điều xuất ra hết.
    Học hỏi - học hỏi - học hỏi tới cùng
    --> Học hỏi đến khi nào ra vấn đề thì học hỏi vấn đề khác
    và học hỏi - học hỏi - học hỏi đến
    .

  4. #4
    Ngày gia nhập
    12 2010
    Bài viết
    85

    Đây là mô hình bài toán của mình:


    Bây giờ mình muốn xuất như sau:
    Tên nhân viên, tên hàng, mã phiếu nhập, ngày nhập, số lượng nhập, đơn giá nhập, mã phiếu xuất, ngày xuất, số lượng xuất, đơn giá xuất. Ví dụ:
    tennv |tenhang | mapn |ngayn.....|..sln.....|dgn.....|mapx..|ngayx...|sl x....|dgx
    son......maytinh......1...1/1/2011....10......10000.....2......1/2/2011...1......1000
    son......mayin.................................... ..................1......1/1/2011...2......5000
    son......mayin.........2.....2/1/2011....10......1000

    Nếu chỉ xuất nhập, hoặc xuất hoặc cả nhập lẫn xuất thì mình làm được, nhưng ghép chung 3 trường hợp thì mình...pó tay.
    Học hỏi - học hỏi - học hỏi tới cùng
    --> Học hỏi đến khi nào ra vấn đề thì học hỏi vấn đề khác
    và học hỏi - học hỏi - học hỏi đến
    .

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Trích dẫn Nguyên bản được gửi bởi sonsonsonson Xem bài viết
    ...
    Ví dụ:
    tennv |tenhang | mapn |ngayn.....|..sln.....|dgn.....|mapx..|ngayx...|sl x....|dgx
    son......maytinh......1...1/1/2011....10......10000.....2......1/2/2011...1......1000
    son......mayin.................................... ..................1......1/1/2011...2......5000
    son......mayin.........2.....2/1/2011....10......1000
    Chi tiết trong ví dụ trên vẫn chưa đủ.
    Thứ nhất, nếu một NV nhập món hàng nhiều lần và xuất nhiều lần thì lấy tất cá các lần nhập xuất hay chỉ lấy lần nhập và lần xuất gần nhất
    Thứ hai, khi nào thì nhập và xuất được gọp lại thành một hàng? Trong ví dụ trên, 'son' có 1 dòng nhập và xuất 'maytinh' nhưng lại có 2 dòng riêng biệt cho nhập và xuất 'mayin'

    Đừng ngạc nhiên khi thấy tôi đòi hỏi chi tiết nhiều quá. Tôi là chuyên viên về dữ liệu. Một báo cáo luôn luôn đòi hỏi đầy đủ yêu cầu. Nếu muốn làm việc lâu năm vời dữ liệu, bạn cũng nên tập thói quen thiết kế đầy đủ yêu cầu cho báo cáo trước khi bắt đầu viết code truy xuất.

  6. #6
    Ngày gia nhập
    12 2010
    Bài viết
    85

    Mặc định Lọc ra các mặt hàng do nhân viên 'son' nhập - xuất!

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Chi tiết trong ví dụ trên vẫn chưa đủ.
    Thứ nhất, nếu một NV nhập món hàng nhiều lần và xuất nhiều lần thì lấy tất cá các lần nhập xuất hay chỉ lấy lần nhập và lần xuất gần nhất
    Thứ hai, khi nào thì nhập và xuất được gọp lại thành một hàng? Trong ví dụ trên, 'son' có 1 dòng nhập và xuất 'maytinh' nhưng lại có 2 dòng riêng biệt cho nhập và xuất 'mayin'

    Đừng ngạc nhiên khi thấy tôi đòi hỏi chi tiết nhiều quá. Tôi là chuyên viên về dữ liệu. Một báo cáo luôn luôn đòi hỏi đầy đủ yêu cầu. Nếu muốn làm việc lâu năm vời dữ liệu, bạn cũng nên tập thói quen thiết kế đầy đủ yêu cầu cho báo cáo trước khi bắt đầu viết code truy xuất.
    - Mình thống kê các mặt hàng do nhân viên 'son' nhập xuất trong khoảng thời gian cho trước. Nếu một mặt hàng được nhân viên 'son' nhập lẫn xuất thì xuất ra 1 dòng, còn chỉ nhập thì xuất ở các thông tin của trường nhập, nếu chỉ xuất thì cũng thế. Ví dụ trên mình cho nhầm, nếu máy in được nhân viên 'son' nhập và xuất thì chỉ xuất cùng 1 dòng. Mình xin cho ví dụ lại:
    tennv |tenhang | mapn |ngayn.....|..sln.....|dgn.....|mapx..|ngayx...|sl x....|dgx
    son......maytinh......1...1/1/2011....10......10000.....2......1/2/2011...1......1000
    son......mayin.................................... ..................1......1/1/2011...2......5000
    son......mayfax.........2.....2/1/2011....10......1000
    Học hỏi - học hỏi - học hỏi tới cùng
    --> Học hỏi đến khi nào ra vấn đề thì học hỏi vấn đề khác
    và học hỏi - học hỏi - học hỏi đến
    .

  7. #7
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Yêu cầu trông đơn giản nhưng thực chất để thực hiện rất dài

    Trước hết bạn phải biết cách kiếm nhập và xuất gần đây nhất (trong khoảng thời gian ngayDau và ngayCuoi)

    Code:
    select a.maNV, a.maPN, a.ngayNhap, b.maHang, b.soLuong, b.donGia
    from (
           select x.maNV, x.maPN, x.ngayNhap from PhieuNhap x 
           where x.maNV = 'son'
           and x.ngayNhap in (select max(ngayNhap) from PhieuNhap where maNV = x.maNV
                             and ngayNhap between ngayDau and ngayCuoi)
          ) a
    inner join ChiTietPhieuNhap b on a.maPN = b.maPN
    
    select a.maNV, a.maPX, a.ngayXuat, b.maHang, b.soLuong, b.donGia
    from (
           select x.maNV, x.maPX, x.ngayXuat from PhieuXuat x 
           where x.maNV = 'son'
           and x.ngayXuat in (select max(ngayXuat) from PhieuXuat where maNV = x.maNV
                             and ngayXuat between ngayDau and ngayCuoi)
          ) a
    inner join ChiTietPhieuXuat b on a.maPX = b.maPX
    Dể có thể tạo bảng "không có thì để trống", bạn phải dùng FULL JOIN để join hai câu trên

    Code:
    select Coalesce(nhap.maNV, xuat.maNV) maNV, Coalesce(nhap.maHang, xuat.maHang) maHang, maPH, ngayNhap, sln, dgn, maPX, ngayXuat, slx, dgx
    from (select a.maNV, a.maPN, a.ngayNhap, b.maHang, b.soLuong sln, b.donGia dgn
          from (
                 select x.maNV, x.maPN, x.ngayNhap from PhieuNhap x 
                 where x.maNV = 'son'
                 and x.ngayNhap in (select max(ngayNhap) from PhieuNhap where maNV = x.maNV
                                   and ngayNhap between ngayDau and ngayCuoi)
                ) a
          inner join ChiTietPhieuNhap b on a.maPN = b.maPN) nhap
    FULL JOIN
         (select a.maNV, a.maPX, a.ngayXuat, b.maHang, b.soLuong slx, b.donGia dgx
          from (
                 select x.maNV, x.maPX, x.ngayXuat from PhieuXuat x 
                 where x.maNV = 'son'
                 and x.ngayXuat in (select max(ngayXuat) from PhieuXuat where maNV = x.maNV
                                   and ngayXuat between ngayDau and ngayCuoi)
                ) a
          inner join ChiTietPhieuXuat b on a.maPX = b.maPX) xuat
    ON nhap.maNV = xuat.maNV and nhap.maHang = xuat.maHang
    Đem câu trên inner join với bảng nhân viên và bảng hàng hóa để láy tên NV và tên HH

    Code:
    select nv.tenNV, hh.tenHang, maPH, ngayNhap, sln, dgn, maPX, ngayXuat, slx, dgx
    FROM
    (select Coalesce(nhap.maNV, xuat.maNV) maNV, Coalesce(nhap.maHang, xuat.maHang) maHang, ngayNhap, sln, dgn, ngayXuat, slx, dgx
    from (select a.maNV, a.maPN, a.ngayNhap, b.maHang, b.soLuong sln, b.donGia dgn
          from (
                 select x.maNV, x.maPN, x.ngayNhap from PhieuNhap x 
                 where x.maNV = 'son'
                 and x.ngayNhap in (select max(ngayNhap) from PhieuNhap where maNV = x.maNV
                                   and ngayNhap between ngayDau and ngayCuoi)
                ) a
          inner join ChiTietPhieuNhap b on a.maPN = b.maPN) nhap
    FULL JOIN
         (select a.maNV, a.maPX, a.ngayXuat, b.maHang, b.soLuong slx, b.donGia dgx
          from (
                 select x.maNV, x.maPX, x.ngayXuat from PhieuXuat x 
                 where x.maNV = 'son'
                 and x.ngayXuat in (select max(ngayXuat) from PhieuXuat where maNV = x.maNV
                                   and ngayXuat between ngayDau and ngayCuoi)
                ) a
          inner join ChiTietPhieuXuat b on a.maPX = b.maPX) xuat
    ON nhap.maNV = xuat.maNV and nhap.maHang = xuat.maHang) sub1
    INNER JOIN NhanVien nv ON nv.maNV = sub1.maNV
    INNER JOIN HangHoa hh ON hh.maHang = sub1.maHang

  8. #8
    Ngày gia nhập
    12 2010
    Bài viết
    85

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Yêu cầu trông đơn giản nhưng thực chất để thực hiện rất dài

    Trước hết bạn phải biết cách kiếm nhập và xuất gần đây nhất (trong khoảng thời gian ngayDau và ngayCuoi)
    [/code]

    oh. Cảm ơn bạn nhiều lắm. Bạn học chuyên ngành csdl ah? Nhân tiện cho mình hỏi luôn: Bây giờ ngày mình lưu vào csdl có dạng: 9/2/2011 1:53:30 PM (ngày 2 tháng 9 năm 2011, lúc 13h50p30s chiều).
    Vậy khi truy vấn làm sao để nó hiểu câu lệnh này:

    select * from phieunhap where ngaynhap between '9/1/2011' and '9/2/2011' ?

    Mình đã làm như sau:
    select * from phieunhap WHERE (select convert(varchar,ngaynhap,101) from phieunhap) between '9/1/2011' and '9/2/2011'
    Nhưng vẫn không được!
    Đã được chỉnh sửa lần cuối bởi sonsonsonson : 02-09-2011 lúc 03:10 PM.
    Học hỏi - học hỏi - học hỏi tới cùng
    --> Học hỏi đến khi nào ra vấn đề thì học hỏi vấn đề khác
    và học hỏi - học hỏi - học hỏi đến
    .

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Cái này bạn đã hỏi rồi và đã được trả lời rồi. Chịu khó xem lại.

Các đề tài tương tự

  1. Lập trình C++ Bài tập nhập xuất sinh viên
    Gửi bởi khachung_uit trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 11
    Bài viết cuối: 21-11-2014, 06:13 PM
  2. Bài tập về nhập xuất một nhân viên bằng cấu trúc và con trỏ bị lỗi!!!
    Gửi bởi anhtran trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 27-06-2011, 09:13 PM
  3. Bài tập C | Nhập xuất sinh viên, lỗi không cho nhập điểm trung bình???
    Gửi bởi phamdankhoi trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 13
    Bài viết cuối: 11-05-2009, 08:01 AM

Quyền hạn của bạn

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