Truy vấn trong SQL?

Liên hệ QC
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
Xin chào anh Hai Lúa, sau một hồi loay hoay với câu lệnh truy vấn bên dưới của anh OT đã ứng dụng thử vào SQL được rồi ạ, cảm ơn anh Hai Lúa nhiều ạ.
Mã:
SELECT      NXT.[MA_HANG],NXT.[LOTNO],--MH.[TEN_HANG],
SUM(TONDAUKY) AS [TONDAUKY],SUM(NHAP) AS [NHAP],SUM(XUAT) AS [XUAT],SUM(TON) AS [TON]
FROM       (
SELECT TDK.[MA_HANG], TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[QTY] AS [TONDAUKY], 0 AS [NHAP],0 AS [XUAT], TDK.[QTY] AS [TON]
FROM [KHOHANG].[dbo].[TONDAUKY] TDK WHERE (TDK.[MA_HANG]= N'MH0001' AND TDK.[LOTNO]=N'L246357' AND TDK.[KHO_LUU_TRU] LIKE N'%A%')
UNION ALL
SELECT XN.[MA_HANG], XN.[KHO_LUU_TRU],XN.[LOTNO], 0, IIF(XN.[KIEU]='N',XN.[QTY],0) AS [NHAP],IIF(XN.[KIEU]='X',XN.[QTY],0) AS [XUAT], IIF(XN.[KIEU]='N',XN.[QTY],0)-IIF(XN.[KIEU]='X',XN.[QTY],0)
FROM [KHOHANG].[dbo].[XN] XN WHERE (XN.[MA_HANG]= N'MH0001' AND XN.[LOTNO]=N'L246357' ) AND (XN.[NGAY_TT] >='20201001' AND  XN.[NGAY_TT] <='20201007')
) NXT
--INNER JOIN [KHOHANG].[dbo].[DMHH] MH ON NXT.[MA_HANG]=MH.[MA_HANG]
GROUP BY   NXT.[MA_HANG],NXT.[LOTNO]--,MH.[TEN_HANG]
Tuy nhiên với câu lệnh trên OT phải xóa bỏ chuyển sang comment những chỗ
--INNER JOIN [KHOHANG].[dbo].[DMHH] MH ON NXT.[MA_HANG]=MH.[MA_HANG]
--MH.[TEN_HANG]
Thì kết quả mới chạy đúng. híc nhìn câu lệnh mới truy vấn theo vài trường mà thấy dài thấy khiếp quá.
---
Còn nếu để tham chiếu đến [DMHH] nó sẽ trả về kết quả sai ạ, không biết OT còn sai sót nào không anh:
Mã:
TONDAUKY    = 1050.000;
NHAP =  2723.000;
XUAT  =  2800.000;
TON =    973.000
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
Xin chào bạn excel_lv1.5,
OT thử chạy câu lệnh này trước trước SQL hệ thống hiển thị thông báo thành thông , chạy lần thứ 2 không được như vậy có nghĩa là đã có dmhh?
Chỗ này bạn cho hỏi OT thêm khi chạy thế này mặc dù là câ lệnh Select nhưng nó có đưa dữ liệu thêm mới vào bảng dmhh trong DB không ạ?
Nếu nó thêm vào có lẽ là làm theo cách này không được an toàn phải không ạ.
Và tiếp theo OT chạy lại câu #188 thì dữ liệu vẫn không xuất hiện gì ạ, hihi dù sao vấn đề của OT cũng đã được giải quyết theo cách làm của anh Hai Lúa được rồi nên bạn không cần phải bận tâm nữa đâu ạ.
Nếu không sử dụng được các câu lệnh truy vấn kiểu SQL nữa OT cũng đã nghĩ đến việc lấy dữ liệu của từng bảng về theo các điều kiện truy vấn rồi dùng VBA xử lý ra dữ liệu NXT ạ, nhưng cách này nếu người dùng lọc khoảng thời gian dài mà bản ghi nhiều chắc là ngồi khóc :D.
Xin cảm ơn tất cả mọi người đã giúp đỡ OT ạ.
Kính chúc mọi người buổi tối vui khỏe.
%$$
 
Lần chỉnh sửa cuối:
Xin chào các bạn,
Hic đang máu me hứng thú với SQL, OT đang muốn một câu lệnh truy vấn để so sánh 2 bảng dữ liệu A & B kết quả làm để trả về dữ liệu như trong vùng màu xanh.
OT đã tìm kiếm nguồn trên trên mạng và loay hoay thử nhưng chưa tìm thấy câu lệnh nào phù hợp với vấn đề của OT đề cập nên OT up lên đây nhờ các bạn xem & giúp đỡ OT ạ.

1602071951956.png
 

File đính kèm

  • AB.xlsx
    13.4 KB · Đọc: 7
Chắc là
Mã:
SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON-B.TON AS CHENH_LECH FROM A INNER JOIN B ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU
 
Chắc là
Mã:
SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON-B.TON AS CHENH_LECH FROM A INNER JOIN B ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU
Cảm ơn bạn Hau151978 đã quan tâm và giúp đỡ OT ạ,
OT thử câu lệnh truy vấn của bạn trong môi trường Excel thì báo lỗi: "Syntax error in JOIN operation."
Bạn xem giúp OT với ạ:
Mã:
Sub SOSANH2BANG_SQL()
    Dim strSQL As String
    strSQL = "SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON - B.TON AS CHENH_LECH FROM [A$] " & _
             "INNER JOIN [B$] ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet9.Range("A3").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
 
Cảm ơn bạn Hau151978 đã quan tâm và giúp đỡ OT ạ,
OT thử câu lệnh truy vấn của bạn trong môi trường Excel thì báo lỗi: "Syntax error in JOIN operation."
Bạn xem giúp OT với ạ:
Mã:
Sub SOSANH2BANG_SQL()
    Dim strSQL As String
    strSQL = "SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON - B.TON AS CHENH_LECH FROM [A$] " & _
             "INNER JOIN [B$] ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet9.Range("A3").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
A! Được rồi cảm ơn bạn Hau151978 .
Tôi giữ nguyên câu lệnh truy vấn trên của bạn:
Mã:
strSQL = "SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON - B.TON AS CHENH_LECH FROM A " & _
             "INNER JOIN B ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU"
Nhưng trong Excel phải thêm Name A & name B cho 2 bảng thì được, tôi chưa biết nguyên nhân vì sao lại như vậy.
Bạn nào biết xin hãy giải thích giúp với ạ.
 
A! Được rồi cảm ơn bạn Hau151978 .
Tôi giữ nguyên câu lệnh truy vấn trên của bạn:
Mã:
strSQL = "SELECT A.MA_HANG AS MA_HANG,A.KHO_LUU_TRU AS KHO_LUU_TRU,A.TON AS TON_A,B.TON AS TON_B,A.TON - B.TON AS CHENH_LECH FROM A " & _
             "INNER JOIN B ON A.MA_HANG=B.MA_HANG AND A.KHO_LUU_TRU=B.KHO_LUU_TRU"
Nhưng trong Excel phải thêm Name A & name B cho 2 bảng thì được, tôi chưa biết nguyên nhân vì sao lại như vậy.
Bạn nào biết xin hãy giải thích giúp với ạ.
Ahihi, thì ra là vậy A & B nếu không đặt tên thì Code nó không hiểu Bảng A hay cột A.
Nếu sửa bảng A thành Bang_1 và bảng B thành Bang_2 thì không cần phải đặt name cho mỗi bảng..
OT hiểu như vậy, ^_^
:yahoo:

Híc không hiểu sao Tây họ làm phức tạp thế ạ, hay do OT hiểu là so sánh không phải là nối nên tìm kiếm không đúng từ khóa ạ:
 
Lần chỉnh sửa cuối:
Mình thì nghĩ là A$ và B$ khác A và B nên Excel không hiểu, nếu không dùng name thì có thể đặt alias thành ... FROM [A$] A INNER JOIN [B$] B... (mình đoán thôi).
 
Xin chào các bạn,
OT đang sử dụng 3 câu lệnh truy vấn sau và lấy được kết quả ra 3 vùng, như trong kèm bến dưới:
Mã:
--Truy vấn 1:
SELECT C.[ODER_NUMBER],COUNT(C.[ODER_NUMBER]) AS [TYPE_A]
FROM [TEST].[dbo].[THUC_TE] C
WHERE  (C.[EPXCODE] like N'%201005%') GROUP BY C.[ODER_NUMBER]

--Truy vấn 2:
SELECT C.[ODER_NUMBER],MAX(C.[ODER_CHANGE]) as [TYPE_P]
FROM [TEST].[dbo].[THUC_TE] C
WHERE  (C.[EPXCODE] like N'%201005%') GROUP BY C.[ODER_NUMBER]

--Truy vấn 3:
SELECT P.[PLAN_NUMBER],P.[ITEM_CODE],MAX(P.[QTY]) AS [QTY]
FROM [TEST].[dbo].[KE_HOACH] P
INNER JOIN [TEST].[dbo].[THUC_TE] C ON P.[EPXCODE] =  C.[EPXCODE] AND  P.[PLAN_NUMBER] =  C.[ODER_NUMBER]
WHERE (P.[EPXCODE] like N'%201005%')
GROUP BY  P.[PLAN_NUMBER],P.[ITEM_CODE],P.[EPXCODE]

Nhờ các bạn giúp đỡ để làm thế nào để gộp cả 3 câu lệnh này thành 1 để có thể ra được bảng dữ liệu gộp ạ:

1602261692904.png
 

File đính kèm

  • GOP_TRUY_VAN.xlsx
    12.6 KB · Đọc: 9
Xin chào các bạn,
OT đang sử dụng 3 câu lệnh truy vấn sau và lấy được kết quả ra 3 vùng, như trong kèm bến dưới:
Mã:
--Truy vấn 1:
SELECT C.[ODER_NUMBER],COUNT(C.[ODER_NUMBER]) AS [TYPE_A]
FROM [TEST].[dbo].[THUC_TE] C
WHERE  (C.[EPXCODE] like N'%201005%') GROUP BY C.[ODER_NUMBER]

--Truy vấn 2:
SELECT C.[ODER_NUMBER],MAX(C.[ODER_CHANGE]) as [TYPE_P]
FROM [TEST].[dbo].[THUC_TE] C
WHERE  (C.[EPXCODE] like N'%201005%') GROUP BY C.[ODER_NUMBER]

--Truy vấn 3:
SELECT P.[PLAN_NUMBER],P.[ITEM_CODE],MAX(P.[QTY]) AS [QTY]
FROM [TEST].[dbo].[KE_HOACH] P
INNER JOIN [TEST].[dbo].[THUC_TE] C ON P.[EPXCODE] =  C.[EPXCODE] AND  P.[PLAN_NUMBER] =  C.[ODER_NUMBER]
WHERE (P.[EPXCODE] like N'%201005%')
GROUP BY  P.[PLAN_NUMBER],P.[ITEM_CODE],P.[EPXCODE]

Nhờ các bạn giúp đỡ để làm thế nào để gộp cả 3 câu lệnh này thành 1 để có thể ra được bảng dữ liệu gộp ạ:

View attachment 247102
Lồng nó vào là được bạn

Mã:
SELECT P.[PLAN_NUMBER],P.[ITEM_CODE],MAX(P.[QTY]) AS [QTY], a.[TYPE_A], a.[TYPE_P]
FROM [TEST].[dbo].[KE_HOACH] P
INNER JOIN [TEST].[dbo].[THUC_TE] C ON P.[EPXCODE] =  C.[EPXCODE] AND  P.[PLAN_NUMBER] =  C.[ODER_NUMBER]
inner join
(
    SELECT C.[ODER_NUMBER],COUNT(C.[ODER_NUMBER]) AS [TYPE_A],MAX(C.[ODER_CHANGE]) as [TYPE_P]
    FROM [TEST].[dbo].[THUC_TE] C
    WHERE  (C.[EPXCODE] like N'%201005%')
    GROUP BY C.[ODER_NUMBER]
) A on P.[PLAN_NUMBER]=a.[ODER_NUMBER]
WHERE (P.[EPXCODE] like N'%201005%')
GROUP BY  P.[PLAN_NUMBER],P.[ITEM_CODE],P.[EPXCODE]
 
Xin chào các bạn,
OT đang sử dụng 3 câu lệnh truy vấn sau và lấy được kết quả ra 3 vùng, như trong kèm bến dưới:
...

Thử cách này xem nhé. Đưa 2 cái Count() vô câu truy vấn thứ 3 luôn.


Mã:
SELECT P.[PLAN_NUMBER],P.[ITEM_CODE],MAX(P.[QTY]) AS [QTY], COUNT(C.[ODER_NUMBER]) AS [TYPE_A],MAX(C.[ODER_CHANGE]) as [TYPE_P]
FROM [TEST].[dbo].[KE_HOACH] P
INNER JOIN [TEST].[dbo].[THUC_TE] C ON P.[EPXCODE] =  C.[EPXCODE] AND  P.[PLAN_NUMBER] =  C.[ODER_NUMBER]
WHERE (P.[EPXCODE] like N'%201005%')
GROUP BY  P.[PLAN_NUMBER],P.[ITEM_CODE],P.[EPXCODE]
 
Xin chào @excel_lv1.5 , @ongke0711,
Cảm ơn 2 người OT đã thử thành công với 2 câu lệnh gộp trên.
Đúng là OT đã nghĩ đến cách dùng 'INNER JOIN' sau khi được @Hau151978 hướng dẫn ở bài #203 và OT cũng đã viết vào câu lệnh 3 nhưng chưa biết lồng ghép, kỹ thuật lồng ghép đúng cả một nghệ thuật.
Xin cảm ơn tất cả mọi người.
 
Xin chào tất cả các bạn,
Vẫn là vấn đề liên quan đến câu lệnh truy vấn lấy dữ liệu NXT ạ, cụ thể là:
OT có 1 câu truy vấn bên dưới, nếu chạy toàn bộ câu lệnh này thì gọi là CAU LENH1: BAO BAO GOM KHO_LUU_TRU
Thì là câu lệnh 1 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 1,bao gồm cột KHO_LUU_TRU:

Còn nếu chạy khúc giữa, từ :
...2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
đến
----------------------------->KET THUC CAU LENH 2
Thì là câu lệnh 2 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 2, không bao gồm cột KHO_LUU_TRU:

Nhưng các câu truy vấn trên chỉ lấy được 1 mã hàng hoặc 1 kho lưu trữ mà không thể lấy nhiều mã hàng hay nhiều kho lưu trữ.
Nhờ các bạn giúp đỡ OT câu lệnh để xử lý được vấn đề này với ạ.


OT xin phép gửi câu lệnh & ảnh kèm dữ liệu mô phỏng để các bạn xem & giúp đỡ ạ:

Mã:
---1) CAU LENH1: BAO BAO GOM KHO_LUU_TRU
SELECT Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO],MAX(Z.TONDAUKY) AS [TONDAUKY],MAX(Z.NHAP) AS [NHAP],MAX(Z.XUAT) AS [XUAT],MAX(Z.TON) AS [TON]
FROM (

---2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
SELECT NXT.[MA_HANG],NXT.[LOTNO],
SUM(TONDAUKY) AS [TONDAUKY],SUM(NHAP) AS [NHAP],SUM(XUAT) AS [XUAT],SUM(TON) AS [TON]
FROM (
SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG] AS [TONDAUKY], 0 AS [NHAP],0 AS [XUAT], TDK.[SO_LUONG] AS [TON]
FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
AND (TDK.[MA_HANG]= N'MH0001') AND (TDK.[KHO_LUU_TRU] LIKE N'%A%')
AND (TDK.[LOTNO]=N'L246357')
UNION ALL
SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%') ,XN.[SO_LUONG],0) AS [NHAP],
IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0) AS [XUAT],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%'),XN.[SO_LUONG],0)-IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0 ) AS [TON]
FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
-----------------------------KET THUC CAU LENH 2

) Z
INNER JOIN [KHOHANG].[dbo].[KQ_KIEM_KE] T ON  Z.MA_HANG=T.MA_HANG
GROUP BY   Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO]
-----------------------------KET THUC CAU LENH 1

1602348201466.png
 
Lần chỉnh sửa cuối:
Xin chào tất cả các bạn,
Vẫn là vấn đề liên quan đến câu lệnh truy vấn lấy dữ liệu NXT ạ, cụ thể là:
OT có 1 câu truy vấn bên dưới, nếu chạy toàn bộ câu lệnh này thì gọi là CAU LENH1: BAO BAO GOM KHO_LUU_TRU
Thì là câu lệnh 1 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 1,bao gồm cột KHO_LUU_TRU:

Còn nếu chạy khúc giữa, từ :
...2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
đến
----------------------------->KET THUC CAU LENH 2
Thì là câu lệnh 2 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 2, không bao gồm cột KHO_LUU_TRU:

Nhưng các câu truy vấn trên chỉ lấy được 1 mã hàng hoặc 1 kho lưu trữ mà không thể lấy nhiều mã hàng hay nhiều kho lưu trữ.
Nhờ các bạn giúp đỡ OT câu lệnh để xử lý được vấn đề này với ạ.


OT xin phép gửi câu lệnh & ảnh kèm dữ liệu mô phỏng để các bạn xem & giúp đỡ ạ:

Mã:
---1) CAU LENH1: BAO BAO GOM KHO_LUU_TRU
SELECT Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO],MAX(Z.TONDAUKY) AS [TONDAUKY],MAX(Z.NHAP) AS [NHAP],MAX(Z.XUAT) AS [XUAT],MAX(Z.TON) AS [TON]
FROM (

---2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
SELECT NXT.[MA_HANG],NXT.[LOTNO],
SUM(TONDAUKY) AS [TONDAUKY],SUM(NHAP) AS [NHAP],SUM(XUAT) AS [XUAT],SUM(TON) AS [TON]
FROM (
SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG] AS [TONDAUKY], 0 AS [NHAP],0 AS [XUAT], TDK.[SO_LUONG] AS [TON]
FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
AND (TDK.[MA_HANG]= N'MH0001') AND (TDK.[KHO_LUU_TRU] LIKE N'%A%')
AND (TDK.[LOTNO]=N'L246357')
UNION ALL
SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%') ,XN.[SO_LUONG],0) AS [NHAP],
IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0) AS [XUAT],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%'),XN.[SO_LUONG],0)-IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0 ) AS [TON]
FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
-----------------------------KET THUC CAU LENH 2

) Z
INNER JOIN [KHOHANG].[dbo].[KQ_KIEM_KE] T ON  Z.MA_HANG=T.MA_HANG
GROUP BY   Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO]
-----------------------------KET THUC CAU LENH 1

View attachment 247154
OT đã nghĩ đến việc bỏ các câu lệnh WHERE cho [MA_HANG]= N'MH0001') và [KHO_LUU_TRU] LIKE N'%A%'
Nhưng vấn đề ở chỗ trong câu lệnh IIF bên dưới, nếu có 3 KHO_LUU_TRU ( hoặc KHO_XUAT_HANG) thì có thể liệt kê thêm được, tuy nhiên nếu có rất nhiều KHO_LUU_TRU thì sẽ xử lý thế nào, mong các bạn xem & giúp đỡ OT với ạ:
Mã:
...
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%') ,XN.[SO_LUONG],0) AS [NHAP],
IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0) AS [XUAT],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%'),XN.[SO_LUONG],0)-IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU]
...
Ví dụ thông tin cần thêm (khi cần) ạ:
Bảng danh mục hàng hóa: tên bảng [DMUC_HANG] có 2 trường [MA_HANG],[TEN_HANG]
Bảng danh mục Kho hàng: tên bảng [DMUC_KHOH] có 2 trường [KHO_LUU_TRU],[TEN_KHO]
 
Lần chỉnh sửa cuối:
Xin chào tất cả các bạn,
Vẫn là vấn đề liên quan đến câu lệnh truy vấn lấy dữ liệu NXT ạ, cụ thể là:
OT có 1 câu truy vấn bên dưới, nếu chạy toàn bộ câu lệnh này thì gọi là CAU LENH1: BAO BAO GOM KHO_LUU_TRU
Thì là câu lệnh 1 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 1,bao gồm cột KHO_LUU_TRU:

Còn nếu chạy khúc giữa, từ :
...2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
đến
----------------------------->KET THUC CAU LENH 2
Thì là câu lệnh 2 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 2, không bao gồm cột KHO_LUU_TRU:

Nhưng các câu truy vấn trên chỉ lấy được 1 mã hàng hoặc 1 kho lưu trữ mà không thể lấy nhiều mã hàng hay nhiều kho lưu trữ.
Nhờ các bạn giúp đỡ OT câu lệnh để xử lý được vấn đề này với ạ.


OT xin phép gửi câu lệnh & ảnh kèm dữ liệu mô phỏng để các bạn xem & giúp đỡ ạ:

Mã:
---1) CAU LENH1: BAO BAO GOM KHO_LUU_TRU
SELECT Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO],MAX(Z.TONDAUKY) AS [TONDAUKY],MAX(Z.NHAP) AS [NHAP],MAX(Z.XUAT) AS [XUAT],MAX(Z.TON) AS [TON]
FROM (

---2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
SELECT NXT.[MA_HANG],NXT.[LOTNO],
SUM(TONDAUKY) AS [TONDAUKY],SUM(NHAP) AS [NHAP],SUM(XUAT) AS [XUAT],SUM(TON) AS [TON]
FROM (
SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG] AS [TONDAUKY], 0 AS [NHAP],0 AS [XUAT], TDK.[SO_LUONG] AS [TON]
FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
AND (TDK.[MA_HANG]= N'MH0001') AND (TDK.[KHO_LUU_TRU] LIKE N'%A%')
AND (TDK.[LOTNO]=N'L246357')
UNION ALL
SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%') ,XN.[SO_LUONG],0) AS [NHAP],
IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0) AS [XUAT],
IIF((XN.[KIEU]=1 And XN.[KHO_LUU_TRU] LIKE N'%A%') or (XN.[KIEU]=3 And XN.[KHO_XUAT_HANG] LIKE N'%A%'),XN.[SO_LUONG],0)-IIF((XN.[KIEU]>=2 And XN.[KHO_LUU_TRU] LIKE N'%A%'),XN.[SO_LUONG],0 ) AS [TON]
FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
-----------------------------KET THUC CAU LENH 2

) Z
INNER JOIN [KHOHANG].[dbo].[KQ_KIEM_KE] T ON  Z.MA_HANG=T.MA_HANG
GROUP BY   Z.[MA_HANG],T.[KHO_LUU_TRU],Z.[LOTNO]
-----------------------------KET THUC CAU LENH 1

View attachment 247154
Tôi chỉnh lại như vầy

Mã:
SELECT NXT.[MA_HANG],NXT.[KHO_LUU_TRU],NXT.[LOTNO],
SUM(TONDAUKY)  [TONDAUKY],SUM(NHAP)  [NHAP],SUM(XUAT)  [XUAT],SUM(TON)  [TON]
FROM
(
    SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG]  [TONDAUKY], 0  [NHAP],0  [XUAT], TDK.[SO_LUONG]  [TON]
    FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
    WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
    AND TDK.[KHO_LUU_TRU] LIKE N'%A%'
    UNION ALL
    SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
    (case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)  [NHAP],
    (case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end)  [XUAT],
    (case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)-(case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end) [TON]
    FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
    WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE]
) A
group by NXT.[MA_HANG],[NXT.KHO_LUU_TRU],NXT.[LOTNO]
 
Vẫn là vấn đề liên quan đến câu lệnh truy vấn lấy dữ liệu NXT ạ, cụ thể là:
OT có 1 câu truy vấn bên dưới, nếu chạy toàn bộ câu lệnh này thì gọi là CAU LENH1: BAO BAO GOM KHO_LUU_TRU
Thì là câu lệnh 1 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 1,bao gồm cột KHO_LUU_TRU:

Còn nếu chạy khúc giữa, từ :
...2) CAU LENH2: KHONG BAO GOM KHO_LUU_TRU
đến
----------------------------->KET THUC CAU LENH 2
Thì là câu lệnh 2 và trả về dữ liệu hình ảnh bên dưới của câu lệnh 2, không bao gồm cột KHO_LUU_TRU:

Nhưng các câu truy vấn trên chỉ lấy được 1 mã hàng hoặc 1 kho lưu trữ mà không thể lấy nhiều mã hàng hay nhiều kho lưu trữ.
Nhờ các bạn giúp đỡ OT câu lệnh để xử lý được vấn đề này với ạ.

Anh nghĩ em không nên quá lạm dụng dùng Subquerry. Có những bài toán dùng Subquery là tuyệt chiêu nhưng có những bài nó sẽ chạy ì ạch . Đối với CSDL lớn chục ngàn dòng, nhiều cột thì dùng nhiều cái subquery lồng nhau, sub của sub như bài của em sẽ không là cách hay. Thường thì nên tạo thêm table tạm để xử lý để khỏi phải lồng ghép nhiều query.
 
Tôi chỉnh lại như vầy

Mã:
SELECT NXT.[MA_HANG],NXT.[KHO_LUU_TRU],NXT.[LOTNO],
SUM(TONDAUKY)  [TONDAUKY],SUM(NHAP)  [NHAP],SUM(XUAT)  [XUAT],SUM(TON)  [TON]
FROM
(
    SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG]  [TONDAUKY], 0  [NHAP],0  [XUAT], TDK.[SO_LUONG]  [TON]
    FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
    WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
    AND TDK.[KHO_LUU_TRU] LIKE N'%A%'
    UNION ALL
    SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
    (case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)  [NHAP],
    (case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end)  [XUAT],
    (case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)-(case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end) [TON]
    FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
    WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE]
) A
group by NXT.[MA_HANG],[NXT.KHO_LUU_TRU],NXT.[LOTNO]
Câu truy vấn nhìn gọn và đẹp mắt dễ nhìn quá ạ, OT cảm bạn nhiều nhiều ạ.
Bạn cho OT hỏi thêm
các mệnh đề Case.. When.. OT thấy có liên quan đến cụ thể một kho có ký tự A, vậy đối với các kho B,C.. và rất nhiều kho khác nữa thì xử lý thế nào ạ? OT cũng đã loay hoay suốt chỗ đó mà chưa biết cách xử lý ạ.
Bài đã được tự động gộp:

Anh nghĩ em không nên quá lạm dụng dùng Subquerry. Có những bài toán dùng Subquery là tuyệt chiêu nhưng có những bài nó sẽ chạy ì ạch . Đối với CSDL lớn chục ngàn dòng, nhiều cột thì dùng nhiều cái subquery lồng nhau, sub của sub như bài của em sẽ không là cách hay. Thường thì nên tạo thêm table tạm để xử lý để khỏi phải lồng ghép nhiều query.
Xin chào anh ongke0711,
Cảm ơn anh đã giúp đỡ góp ý cho OT ạ.
Đây là DB của nhà cung cấp phần mềm thiết kế nên có lẽ không thể hay là không nên chỉnh sửa vào đó của họ được đâu anh ạ.
Sờ mó vào đó đến lúc có vde gì chắc là họ không chịu đâu anh.. Hihi
OT đã từng nghĩ đến việc lấy đữ liệu của từng bảng về Excel rồi dùng vba xử lý nhưng dữ liệu ở bảng Nhập Xuất hàng ngày quá nhiều bản ghi, nếu lấy trong vòng 1 tháng khả năng Excel không đủ sức chứa nó ạ.
Thế nên có lẽ với OT không còn cách lựa chọn nào nữa anh ạ, T_T
 
Lần chỉnh sửa cuối:
Câu truy vấn nhìn gọn và đẹp mắt dễ nhìn quá ạ, OT cảm bạn nhiều nhiều ạ.
Bạn cho OT hỏi thêm
các mệnh đề Case.. When.. OT thấy có liên quan đến cụ thể một kho có ký tự A, vậy đối với các kho B,C.. và rất nhiều kho khác nữa thì xử lý thế nào ạ? OT cũng đã loay hoay suốt chỗ đó mà chưa biết cách xử lý ạ.
Tôi thấy bạn sử dụng LIKE, nếu có nhiều nhóm như vậy bạn tạo thêm cột nhóm kho rồi dùng IN
1602398452594.png
Giả sử bạn cần lấy các kho thuộc nhóm A,C thì bạn chỉnh điều kiện SQL như vầy, việc thêm cột có thể dùng Sub để tạo mà không cần thay đổi Table gốc
Mã:
 (case when XN.[KIEU] in (1,3) And XN.[KHO_LUU_TRU] in (select [kho] from [dmkho] where nhomkho in ('A','C')) then XN.[SO_LUONG] else 0 end) [NHAP]
 
Tôi thấy bạn sử dụng LIKE, nếu có nhiều nhóm như vậy bạn tạo thêm cột nhóm kho rồi dùng IN
View attachment 247170
Giả sử bạn cần lấy các kho thuộc nhóm A,C thì bạn chỉnh điều kiện SQL như vầy, việc thêm cột có thể dùng Sub để tạo mà không cần thay đổi Table gốc
Mã:
 (case when XN.[KIEU] in (1,3) And XN.[KHO_LUU_TRU] in (select [kho] from [dmkho] where nhomkho in ('A','C')) then XN.[SO_LUONG] else 0 end) [NHAP]
cảm ơn excel_lv1.5
Như đã nêu trên cách này với OT là gần như không thể, nghĩa là thiết kế của DB như thế nào thì không được thay đổi ạ.
Với lại không thể chia làm nhiều nhóm kho như vậy được ạ, mỗi kho đều là độc lập ạ, xin lỗi vì OT quen dùng like nên viết vậy ạ chứ đáng ra phải viết rõ ràng là =N'Kho_A' ạ. Mỗi kho đểu có thể có 2 nghiệp vụ nhập và xuất.
Tùy vào trường kiểu 1,2,3 để xác định giá trị là xuất hay nhập ạ.
đoạn case when này OT vẫn đang nghĩ việc liên kết đến bảng danh mục kho như đã nêu ở bài #214 không biết có gì sai lệch không ạ.
hic hic
 
Đây là DB của nhà cung cấp phần mềm thiết kế nên có lẽ không thể hay là không nên chỉnh sửa vào đó của họ được đâu anh ạ.
Sờ mó vào đó đến lúc có vde gì chắc là họ không chịu đâu anh.. Hihi
OT đã từng nghĩ đến việc lấy đữ liệu của từng bảng về Excel rồi dùng vba xử lý nhưng dữ liệu ở bảng Nhập Xuất hàng ngày quá nhiều bản ghi, nếu lấy trong vòng 1 tháng khả năng Excel không đủ sức chứa nó ạ.
Thế nên có lẽ với OT không còn cách lựa chọn nào nữa anh ạ, T_T
Nếu tài khoản của bạn của bạn chỉ được quyền Read thì việc tạo Table sẽ không được, nhưng Table tạm vẫn được, khi bạn không sử dụng SQL nữa Table đó sẽ tự xóa, tôi chỉnh lại code trên bằng việc sử dụng Table tạm
Mã:
SELECT TDK.[MA_HANG],TDK.[KHO_LUU_TRU],TDK.[LOTNO], TDK.[SO_LUONG]  [TONDAUKY], 0  [NHAP],0  [XUAT], TDK.[SO_LUONG]  [TON]
into #A
FROM [KHOHANG].[dbo].[KQ_KIEM_KE] TDK
WHERE TDK.[NGAY_KIEM_KE] = (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE])
AND TDK.[KHO_LUU_TRU] LIKE N'%A%'
UNION ALL
SELECT XN.[MA_HANG],XN.[KHO_LUU_TRU],XN.[LOTNO], 0 AS [TONDAUKY],
(case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)  [NHAP],
(case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end)  [XUAT],
(case when XN.[KIEU] in (1,3)  And XN.[KHO_LUU_TRU] LIKE N'%A%' then XN.[SO_LUONG] else 0 end)-(case when XN.[KIEU] =2 And XN.[KHO_LUU_TRU] LIKE N'%A%'then XN.[SO_LUONG] else 0 end) [TON]
FROM [KHOHANG].[dbo].[NHAP_XUAT] XN
WHERE LEFT(XN.[NGAY_THANG],6) >= (SELECT MAX([NGAY_KIEM_KE]) FROM [KHOHANG].[dbo].[KQ_KIEM_KE]

SELECT NXT.[MA_HANG],NXT.[KHO_LUU_TRU],NXT.[LOTNO],
SUM(TONDAUKY)  [TONDAUKY],SUM(NHAP)  [NHAP],SUM(XUAT)  [XUAT],SUM(TON)  [TON]
FROM #A
group by NXT.[MA_HANG],[NXT.KHO_LUU_TRU],NXT.[LOTNO]
Việc sử dụng Subquery trong các môi trường khác không biết sao chứ trong SQL server bạn cứ sử dụng bình thường, trừ khi một sub được gọi nhiều hơn một lần thì nên lưu sub đó vào bảng tạm để tranh query nhiều lần
Bài đã được tự động gộp:

cảm ơn excel_lv1.5
Như đã nêu trên cách này với OT là gần như không thể, nghĩa là thiết kế của DB như thế nào thì không được thay đổi ạ.
Với lại không thể chia làm nhiều nhóm kho như vậy được ạ, mỗi kho đều là độc lập ạ, xin lỗi vì OT quen dùng like nên viết vậy ạ chứ đáng ra phải viết rõ ràng là =N'Kho_A' ạ. Mỗi kho đểu có thể có 2 nghiệp vụ nhập và xuất.
Tùy vào trường kiểu 1,2,3 để xác định giá trị là xuất hay nhập ạ.
đoạn case when này OT vẫn đang nghĩ việc liên kết đến bảng danh mục kho như đã nêu ở bài #214 không biết có gì sai lệch không ạ.
hic hic
Thì tùy biến thôi bạn, nếu không thay đổi Table gốc thì dùng sub tạo thêm thôi, đây là ví dụ cho bài #218, bạn tùy biến cho trường hợp của bạn
Mã:
(case when XN.[KIEU] in (1,3) And XN.[KHO_LUU_TRU] in
(
    select [kho] from
        (
            select *, left([kho],1) [nhomKho] from [dmkho]
        ) where [nhomkho] in ('A','C')
) then XN.[SO_LUONG] else 0 end) [NHAP]
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom