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

Đề tài: Tính tồn kho bằng truy vấn SQL?

  1. #1
    Ngày gia nhập
    06 2007
    Bài viết
    206

    Mặc định Tính tồn kho bằng truy vấn SQL?

    Mình có câu truy vấn sau:
    SQL Code:
    1. SELECT ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt, SUM(ctph.soluong) AS tong
    2. FROM tbPhieuNhapXuat AS ph JOIN tbChiTietPhieuNhapXuat AS ctph
    3. ON ph.maPhieu = ctph.maPhieu
    4. JOIN tbNguyenLieu AS nl
    5. ON ctph.maNguyenLieu = nl.maNguyenLieu
    6. GROUP BY  ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt

    đc kết quả như trong hình.

    Trong kết quả trên có trường [nhap] (bit)
    nhap = 1 : nhap
    nhap = 0 : xuat

    Theo kết quả của câu truy vấn trên thì nguyên liệu của nhập và xuất được xếp từ trên xuống dưới.
    Mình muốn cột [nhap] tách ra thành 2 cột [đã nhập] và [đã xuất] thì phải làm thế nào?
    Mong các bạn hướng dẫn.
    Attached Thumbnails Attached Thumbnails m.JPG  
    Đã được chỉnh sửa lần cuối bởi nth4 : 11-05-2009 lúc 08:55 AM. Lý do: s
    Thà để chửi dốt 1 lần, còn hơn ngu cả đời.

  2. #2
    Ngày gia nhập
    06 2007
    Bài viết
    26

    SQL Code:
    1. SELECT ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt,
    2. [B]SUM(CASE nhap WHEN 1 THEN ctph.soluong ELSE 0 END) AS tongNhap,
    3. SUM(CASE nhap WHEN 0 THEN ctph.soluong ELSE 0 END) AS tongXuat,[/B]
    4. FROM tbPhieuNhapXuat AS ph JOIN tbChiTietPhieuNhapXuat AS ctph
    5. ON ph.maPhieu = ctph.maPhieu
    6. JOIN tbNguyenLieu AS nl
    7. ON ctph.maNguyenLieu = nl.maNguyenLieu
    8. GROUP BY  ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt

    Edit: Bỏ code vào tag code ... Sieuga
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 10-05-2009 lúc 12:26 AM.

  3. #3
    Ngày gia nhập
    06 2007
    Bài viết
    206

    to ngvanmy:
    nếu như làm như bạn thì với một maNguyenLieu mình ko thể cùng lúc xem đc tổng nhập và tống xuất của nó.
    Cảm ơn bạn đã giúp đỡ mình biết đc thêm vài câu lệnh trong câu truy vấn trên.

    Mình đã làm thủ công như sau và ra đc kết quả cũng gần giống như mong muốn.

    1. Tạo ra 2 bảng nhập - xuất riêng từ bảng chính
    SQL Code:
    1. -- phieu nhap
    2. IF EXISTS
    3. (SELECT name, xtype, TYPE FROM sysobjects
    4. WHERE name = 'tbPhieuNhap' AND TYPE = 'U')
    5. DROP TABLE tbPhieuNhap
    6.  
    7. SELECT ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt, SUM(ctph.soluong) AS tong
    8. INTO tbPhieuNhap
    9. FROM tbPhieuNhapXuat AS ph JOIN tbChiTietPhieuNhapXuat AS ctph
    10. ON ph.maPhieu = ctph.maPhieu
    11. JOIN tbNguyenLieu AS nl
    12. ON ctph.maNguyenLieu = nl.maNguyenLieu
    13. WHERE nhap =1
    14. GROUP BY  ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt
    15.  
    16. -- phieu xuat
    17. IF EXISTS
    18. (SELECT name, xtype, TYPE FROM sysobjects
    19. WHERE name = 'tbPhieuXuat' AND TYPE = 'U')
    20. DROP TABLE tbPhieuXuat
    21.  
    22. SELECT ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt, SUM(ctph.soluong) AS tong
    23. INTO tbPhieuXuat
    24. FROM tbPhieuNhapXuat AS ph JOIN tbChiTietPhieuNhapXuat AS ctph
    25. ON ph.maPhieu = ctph.maPhieu
    26. JOIN tbNguyenLieu AS nl
    27. ON ctph.maNguyenLieu = nl.maNguyenLieu
    28. WHERE nhap =0
    29. GROUP BY  ctph.maNguyenLieu, nl.tenNguyenLieu, nhap, nl.dvt

    2. Gom 2 bảng nhập xuất lại để ra nhập và xuất của 1 maNguyenLieu
    SQL Code:
    1. SELECT n.maNguyenLieu, n.tenNguyenLieu, n.dvt, n.tong AS nhap, x.tong AS xuat
    2. FROM tbPhieuNhap n LEFT JOIN tbPhieuXuat x
    3. ON n.maNguyenLieu = x.maNguyenLieu

    3. Tình tồn kho
    SQL Code:
    1. SELECT n.maNguyenLieu, n.tenNguyenLieu, n.dvt,
    2. (CASE WHEN n.tong IS NULL THEN 0 ELSE n.tong END) AS nhap,
    3. (CASE WHEN x.tong IS NULL THEN 0 ELSE x.tong END) AS xuat,
    4. ( (CASE WHEN n.tong IS NULL THEN 0 ELSE n.tong END) -  (CASE WHEN x.tong IS NULL THEN 0 ELSE x.tong END)) AS tonKho
    5. FROM tbPhieuNhap n LEFT JOIN tbPhieuXuat x
    6. ON n.maNguyenLieu = x.maNguyenLieu

    Xem hình đính kèm.

    Điều mình phân vân ở đây là tạo 2 bảng mới như vậy có ổn ko?
    Và nên tạo bảng như thế hay nên tạo 2 bảng tạm? Tại sao?

    Mong các bạn hướng dẫn.
    Cảm ơn các bạn đã quan tâm giúp đỡ!
    Attached Thumbnails Attached Thumbnails 1.JPG   2.JPG   3.JPG  
    Đã được chỉnh sửa lần cuối bởi nth4 : 11-05-2009 lúc 10:06 AM. Lý do: s
    Thà để chửi dốt 1 lần, còn hơn ngu cả đời.

  4. #4
    Ngày gia nhập
    06 2007
    Bài viết
    206

    Đc kết quả như trên thì mình lại phát sinh ra các vấn đề như sau:

    + Tính tồn kho ở trên thì đưa ra đc số lượng tồn kho từ trước đến thời điểm tính. Như vậy mỗi khi có lệnh xuất kho thì ta dựa vào số lượng tồn kho này để xem có đủ xuất hay ko.
    + Khi thực tế người dùng thì muốn xem nhập, xuất theo tháng, theo quý... (từ ngày - đến ngày), như vậy thì có thể có tháng chỉ có xuất mà ko có nhập (miễn trong kho còn đủ để xuất).
    Như vậy thì với câu lệnh query ở trên sử dụng LEFT JOIN thì sẽ ko xuất ra kết quả maNguyenLieu đã xuất:

    SQL Code:
    1. SELECT n.maNguyenLieu, n.tenNguyenLieu, n.dvt, n.tong AS nhap, x.tong AS xuat
    2. FROM tbPhieuNhap n LEFT JOIN tbPhieuXuat x
    3. ON n.maNguyenLieu = x.maNguyenLieu

    Thường thì 1 danh sách báo cáo tồn kho sẽ có định dạng như sau:

    Từ ngày - Đến ngày
    Nguyên liệu | Còn đầu kì | Đã nhập | Đã xuất | Tồn kho

    ví dụ:
    Từ: 01-03-2009 đến 31-03-2009
    Nguyên liệu | Còn đầu kì | Đã nhập | Đã xuất | Tồn kho
    A 100 50 70 80
    B 150 70 50 120
    C 50 30 80 0
    D 200 0 100 100
    E 30 30 0 60

    Mong các bạn hướng dẫn giúp!
    Thà để chửi dốt 1 lần, còn hơn ngu cả đời.

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

  1. Hàm trong C Hỏi truy câp vào trường dữ liệu
    Gửi bởi skd_nt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 15-07-2012, 05:37 PM
  2. Lập trình 1 website thường truy cập PC sang truy cập trong mobile
    Gửi bởi jindo872606 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 27-03-2012, 03:33 PM
  3. Cách truy cập facebook | Nguyên tắc và các công cụ để truy cập facebook
    Gửi bởi Kevin Hoang trong diễn đàn Giải trí - Thư giãn
    Trả lời: 40
    Bài viết cuối: 14-03-2011, 10:13 AM
  4. Một câu truy vấn có thể truy vấn cả CSDL Access và DBase trong C# ko?
    Gửi bởi thuchobiet trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 24-11-2010, 08:25 AM
  5. phân biệt "truy cập" và "truy nhập". Giúp em
    Gửi bởi Gryffindor trong diễn đàn Thắc mắc chung
    Trả lời: 6
    Bài viết cuối: 26-07-2010, 05:02 PM

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