Truy vấn trong SQL?

Liên hệ QC
Bạn gửi cho tôi câu lệnh bạn điều chỉnh tôi xem thử!
Dạ đây ạ, OT gửi bạn nhờ bạn kiểm tra giúp ạ.
Mã:
Select a.[MA_HANG],b.[KHO_LUU_TRU],c.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Bài đã được tự động gộp:

Chỗ trống như hình là "A" hay trống vậy em?

View attachment 246957
Cảm ơn anh Hai Lúa đã quan tâm ạ.
Chỗ trống đó là "A" anh ạ, xin lỗi anh OT không kéo hết lên trên.
Vì OT sử dụng câu lệnh truy vấn để tìm theo từng mã và từng kho lên chỉ có một mã và một kho thôi ạ.
 
Dạ đây ạ, OT gửi bạn nhờ bạn kiểm tra giúp ạ.
Mã:
Select a.[MA_HANG],b.[KHO_LUU_TRU],c.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Bài đã được tự động gộp:


Cảm ơn anh Hai Lúa đã quan tâm ạ.
Chỗ trống đó là "A" anh ạ, xin lỗi anh OT không kéo hết lên trên.
Vì OT sử dụng câu lệnh truy vấn để tìm theo từng mã và từng kho lên chỉ có một mã và một kho thôi ạ.
Em thử code sau và biến tấu nhé.

Mã:
Sub GomDL_HLMT()
    Dim strSQL As String
    strSQL = "SELECT MA_HANG, SO_LUONG AS TONDAUKY, KHO_LUU_TRU, 0 AS NHAP,0 AS XUAT, SO_LUONG AS TON FROM [TDK$] " & _
             "UNION ALL SELECT MA_HANG, 0, KHO_LUU_TRU, IIF(KIEU='N',SO_LUONG,0) AS NHAP,IIF(KIEU='X',SO_LUONG,0) AS XUAT, IIF(KIEU='N',SO_LUONG,0)-IIF(KIEU='X',SO_LUONG,0) FROM [NX$]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A2").CopyFromRecordset .Execute("SELECT MA_HANG, SUM(TONDAUKY), KHO_LUU_TRU, SUM(NHAP), SUM(XUAT),SUM(TON) FROM (" & strSQL & ") GROUP BY MA_HANG, KHO_LUU_TRU")
    End With
  
End Sub
 
Dạ đây ạ, OT gửi bạn nhờ bạn kiểm tra giúp ạ.
Mã:
Select a.[MA_HANG],b.[KHO_LUU_TRU],c.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Bài đã được tự động gộp:


Cảm ơn anh Hai Lúa đã quan tâm ạ.
Chỗ trống đó là "A" anh ạ, xin lỗi anh OT không kéo hết lên trên.
Vì OT sử dụng câu lệnh truy vấn để tìm theo từng mã và từng kho lên chỉ có một mã và một kho thôi ạ.
Lưu ý dùng join trong trường hợp này sẽ không chính xác, bởi vì mỗi dòng phát sinh sẽ có 1 cái tồn đầu kỳ tương ứng với số dòng.
 
Mã:
   ...
    strSQL = "SELECT MA_HANG, SO_LUONG AS TONDAUKY, KHO_LUU_TRU, 0 AS NHAP,0 AS XUAT, SO_LUONG AS TON FROM [TDK$] " & _
             "UNION ALL SELECT MA_HANG, 0, KHO_LUU_TRU, IIF(KIEU='N',SO_LUONG,0) AS NHAP,IIF(KIEU='X',SO_LUONG,0) AS XUAT,
..

Cùng suy nghĩ là dùng Union Query như bác HLMT. Đây là cách truyền thống bên Access hay làm để xử lý NXT.
:)
 
Em thử code sau và biến tấu nhé.

Mã:
Sub GomDL_HLMT()
    Dim strSQL As String
    strSQL = "SELECT MA_HANG, SO_LUONG AS TONDAUKY, KHO_LUU_TRU, 0 AS NHAP,0 AS XUAT, SO_LUONG AS TON FROM [TDK$] " & _
             "UNION ALL SELECT MA_HANG, 0, KHO_LUU_TRU, IIF(KIEU='N',SO_LUONG,0) AS NHAP,IIF(KIEU='X',SO_LUONG,0) AS XUAT, IIF(KIEU='N',SO_LUONG,0)-IIF(KIEU='X',SO_LUONG,0) FROM [NX$]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A2").CopyFromRecordset .Execute("SELECT MA_HANG, SUM(TONDAUKY), KHO_LUU_TRU, SUM(NHAP), SUM(XUAT),SUM(TON) FROM (" & strSQL & ") GROUP BY MA_HANG, KHO_LUU_TRU")
    End With
 
End Sub

Anh Hai Lúa Miền Tây ơi câu lệnh này của anh OT thử trên Excel đúng ý mình rồi nhưng OT đang thử trong SQL và thấy anh không tham chiếu đến bảng DMHH
Anh có thể sửa thêm cho OT tham chiếu thêm đến bảng này nữa được không ạ, vì OT muốn dựa vào Mã hàng để lấy thêm các thông tin khác từ bảng này khi cần ạ.
Cảm ơn anh Hai Lúa Miền Tây
Bài đã được tự động gộp:

Cùng suy nghĩ là dùng Union Query như bác HLMT. Đây là cách truyền thống bên Access hay làm để xử lý NXT.
:)
Hehe, OT cảm ơn anh ongke0711 ạ
 
Anh Hai Lúa Miền Tây ơi câu lệnh này của anh OT thử trên Excel đúng ý mình rồi nhưng OT đang thử trong SQL và thấy anh không tham chiếu đến bảng DMHH
Anh có thể sửa thêm cho OT tham chiếu thêm đến bảng này nữa được không ạ, vì OT muốn dựa vào Mã hàng để lấy thêm các thông tin khác từ bảng này khi cần ạ.
Cảm ơn anh Hai Lúa Miền Tây
Bài đã được tự động gộp:


Hehe, OT cảm ơn anh ongke0711 ạ
Em nên nghiên cứu thêm về các kiểu truy vấn nhé.

Mã:
SELECT     A.MA_HANG,
           B.TEN_HANG,
           SUM(TONDAUKY),
           KHO_LUU_TRU,
           SUM(NHAP),
           SUM(XUAT),
           SUM(TON)
FROM       (" & strSQL & ") A
INNER JOIN [DMHH$] B
ON         A.MA_HANG=B.MA_HANG
GROUP BY   A.MA_HANG,
           KHO_LUU_TRU,
           B.TEN_HANG
 
Dạ đây ạ, OT gửi bạn nhờ bạn kiểm tra giúp ạ.
Mã:
Select a.[MA_HANG],a.[KHO_LUU_TRU],c.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Bài đã được tự động gộp:


Cảm ơn anh Hai Lúa đã quan tâm ạ.
Chỗ trống đó là "A" anh ạ, xin lỗi anh OT không kéo hết lên trên.
Vì OT sử dụng câu lệnh truy vấn để tìm theo từng mã và từng kho lên chỉ có một mã và một kho thôi ạ.
Bạn gắn thêm [kho_luu_tru] và [lot_no] thì bảng danh mục bảng phải có 2 cột đó và điều kiện join cũng phải dùng thêm 2 điều kiện này, sài join cũng bình thường thôi
Mã:
Select a.[MA_HANG],a.[KHO_LUU_TRU],a.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG] and a.[kho_luu_tru]=b.[kho_luu_tru] and a.[lotno]=b.[lotno]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]  and a.[kho_luu_tru]=c.[kho_luu_tru] and a.[lotno]=c.[lotno]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Trong trường hợp này thì không phải là cái Table Dim Dmhh nữa mà là một Table Distinct mới tạo ra từ table TD và NX theo 3 điều kiện [mahang], [kho_luu_tru] và [lotno], bảng dmhh chỉ có [mahang] sẽ không map được cả 3 điều kiện trên
 
Lần chỉnh sửa cuối:
Bạn gắn thêm [kho_luu_tru] và [lot_no] thì bảng danh mục bảng phải có 2 cột đó và điều kiện join cũng phải dùng thêm 2 điều kiện này, sài join cũng bình thường thôi
Mã:
Select a.[MA_HANG],a.[KHO_LUU_TRU],a.[LOTNO],
sum(b.[QTY]) [TDK],
sum(case when c.[KIEU]='N' then c.[QTY] else 0 end) [NHAP],
sum(case when c.[KIEU]='X' then c.[QTY] else 0 end) [XUAT],
sum(b.[QTY])+sum(case when c.[KIEU]='N' then c.[QTY] else 0 end)-sum(case when c.[KIEU]='X' then c.[QTY] else 0 end)  [TON]
From [KHOHANG].[dbo].[DMHH] a
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG] and a.[kho_luu_tru]=b.[kho_luu_tru] and a.[lotno]=b.[lotno]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG]  and a.[kho_luu_tru]=c.[kho_luu_tru] and a.[lotno]=c.[lotno]
Where (c.[MA_HANG] = N'MH0001' and c.[LOTNO] =N'L246357')
and (b.[MA_HANG]= N'MH0001' and b.[LOTNO]=N'L246357' and b.[KHO_LUU_TRU] like N'%A%')
Group by a.[MA_HANG],b.[KHO_LUU_TRU], c.[LOTNO]
Order by a.[MA_HANG]
Cảm ơn Bạn nhiều từ nãy giờ OT vẫn loay hoay chưa ứng dụng các câu truy vấn của anh Hai Lúa và Bạn vào thử trong SQL, hihi
Excel chạy ngon lành chắc là SQL cũng vậy thôi ạ,để OT thử thêm ạ.
 
Cảm ơn Bạn nhiều từ nãy giờ OT vẫn loay hoay chưa ứng dụng các câu truy vấn của anh Hai Lúa và Bạn vào thử trong SQL, hihi
Excel chạy ngon lành chắc là SQL cũng vậy thôi ạ,để OT thử thêm ạ.
Trong SQLServer không có hàm IIF vì vậy em phải chuyển từ IIF sang Case When nhé.
 
Cảm ơn Bạn nhiều từ nãy giờ OT vẫn loay hoay chưa ứng dụng các câu truy vấn của anh Hai Lúa và Bạn vào thử trong SQL, hihi
Excel chạy ngon lành chắc là SQL cũng vậy thôi ạ,để OT thử thêm ạ.
Dùng Union chắc ổn hơn đấy bạn, còn dùng cách tôi bạn phải tạo thêm một table mới thay cho bảng DMHH , vì trong trường hợp này bảng DMHH không sử dụng được nữa, nếu dùng SQL server bạn có thể thử cách pivot
Bài đã được tự động gộp:

Trong SQLServer không có hàm IIF vì vậy em phải chuyển từ IIF sang Case When nhé.
Vẫn có hàm IIF nhe bạn
 
Dùng Union chắc ổn hơn đấy bạn, còn dùng cách tôi bạn phải tạo thêm một table mới thay cho bảng DMHH , vì trong trường hợp này bảng DMHH không sử dụng được nữa, nếu dùng SQL server bạn có thể thử cách pivot
Cảm ơn Bạn nhiều,
OT đã thử câu truy vấn của bạn thấy không ra kết quả gì ngoài các dòng tiêu đề ạ.
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG] and a.[kho_luu_tru]=b.[kho_luu_tru] and a.[lotno]=b.[lotno]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG] and a.[kho_luu_tru]=c.[kho_luu_tru] and a.[lotno]=c.[lotno]
OT thấy các chỗ tô đậm nó khó hiểu thế nào ấy ạ, vì trong bảng a(DMHH) không có trường 'kho_luu_tru' và 'lotno' bạn ạ.
Khi OT xóa các dòng này đi thì số liệu có nhưng chênh lên nhiều như OT đã thông tin bài trước ạ.
Để OT tìm hiểu thêm ạ, cảm ơn bạn đã cố gắng giúp đỡ OT.
 
Em hỏi kỹ lại anh IT đó coi phiên bản 2012 có chưa nhé.
Anh ý không có chuyên môn về những câu lệnh select kiểu này đâu anh, nếu anh ấy biết OT không phải vất vả nhiều về vấn đề này rồi anh ạ.
Anh ấy chỉ cho phép OT quyền vào rồi cũng tạo backup data cho OT nghịch trên DB sau khi backup thôi anh ạ, chứ sờ vào DB thật anh ấy mắng ạ.
 
Anh ý không có chuyên môn về những câu lệnh select kiểu này đâu anh, nếu anh ấy biết OT không phải vất vả nhiều về vấn đề này rồi anh ạ.
Anh ấy chỉ cho phép OT quyền vào rồi cũng tạo backup data cho OT nghịch trên DB sau khi backup thôi anh ạ, chứ sờ vào DB thật anh ấy mắng ạ.
Ý anh là phiên bản 2012 về sau mới có hàm IIF. Những phiên bản trước đó chưa có hàm này. Hay ý em là khác? Ý em là em đang dùng SQLServer 2016 mà không dùng được đoạn truy vấn trên?
 
Cảm ơn Bạn nhiều,
OT đã thử câu truy vấn của bạn thấy không ra kết quả gì ngoài các dòng tiêu đề ạ.
left join [KHOHANG].[dbo].[TONDAUKY] b on a.[MA_HANG]=b.[MA_HANG] and a.[kho_luu_tru]=b.[kho_luu_tru] and a.[lotno]=b.[lotno]
left join [KHOHANG].[dbo].[XN] c on a.[MA_HANG]=c.[MA_HANG] and a.[kho_luu_tru]=c.[kho_luu_tru] and a.[lotno]=c.[lotno]
OT thấy các chỗ tô đậm nó khó hiểu thế nào ấy ạ, vì trong bảng a(DMHH) không có trường 'kho_luu_tru' và 'lotno' bạn ạ.
Khi OT xóa các dòng này đi thì số liệu có nhưng chênh lên nhiều như OT đã thông tin bài trước ạ.
Để OT tìm hiểu thêm ạ, cảm ơn bạn đã cố gắng giúp đỡ OT.
join nó giống hàm lookup trong excel cho phép tìm kiếm nhiều điều kiện
Thì tôi nói là bạn làm NXT theo 3 yếu tố [mahang],[kho_luu_tru],[lotno] nên bảng DMHH sẽ không sử dụng được do nó chỉ có [mahang], nên bạn dùng cách union thì sẽ ổn hơn.
Còn vẫn muốn đi theo hướng đó thì bạn có thể thêm 1 đoạn tạo ra một bảng table DMHH mới như vầy, rồi chạy lại đoạn code trên (hoặc lồng vào đoạn code trên cũng được)

Mã:
select DISTINCT [ma_hang],[kho_luu_tru],[lotno]
into #dmhh
from
(
    select [ma_hang],[kho_luu_tru],[lotno] from [TDK]
    union all
    select [ma_hang],[kho_luu_tru],[lotno] from [NX]
) a
 
Ý anh là phiên bản 2012 về sau mới có hàm IIF. Những phiên bản trước đó chưa có hàm này. Hay ý em là khác? Ý em là em đang dùng SQLServer 2016 mà không dùng được đoạn truy vấn trên?
À ý em là phiên bản SQL của OT là sau 2012 rồi nên OT yên tâm không phải sửa gì câu lệnh truy vấn của anh nữa ạ.
OT chạy câu lệnh truy vấn của anh rồi và nó không báo lỗi gì có nghĩa là iff có thể sử dụng được ạ, nhưng kết quả chưa đúng chắc là sai sót chỗ nào thôi ạ do OT bổ sung thêm select kèm 1 thêm trường, OT đang mò mẫm.
Hic cả ngày hôm nay không làm ăn gì được ngoài test cái vấn đề này anh ạ, công việc ùn hôm sau làm tiếp cũng được anh ạ hehe
Bài đã được tự động gộp:

join nó giống hàm lookup trong excel cho phép tìm kiếm nhiều điều kiện
Thì tôi nói là bạn làm NXT theo 3 yếu tố [mahang],[kho_luu_tru],[lotno] nên bảng DMHH sẽ không sử dụng được do nó chỉ có [mahang], nên bạn dùng cách union thì sẽ ổn hơn.
Còn vẫn muốn đi theo hướng đó thì bạn có thể thêm 1 đoạn tạo ra một bảng table DMHH mới như vầy, rồi chạy lại đoạn code trên (hoặc lồng vào đoạn code trên cũng được)

Mã:
select DISTINCT [ma_hang],[kho_luu_tru],[lotno]
into #dmhh
from
(
    select [ma_hang],[kho_luu_tru],[lotno] from [TDK]
    union all
    select [ma_hang],[kho_luu_tru],[lotno] from [NX]
) a
Dạ vâng cảm ơn bạn nhiều, OT sẽ test hết các trường hợp rồi thông tin lại ạ.
 
Web KT
Back
Top Bottom