Truy vấn trong SQL?

Liên hệ QC
Thường thì trong DB sẽ có bảng danh mục, muốn tạo riêng thì có thể tạo từ 2 bảng [TDK] và [NX]

Mã:
select DISTINCT a.[ma_hang]
into #category
from
(
    select a.[ma_hang]
    from [TDK] a
    union all
    select a.[ma_hang]
    from [NX] a
) a
Cảm ơn bạn nhiều ạ,
Đúng là DB có bảng danh mục hàng thường gọi là chung là masterItem ạ.
Giả sử không sử dụng bảng danh mục hàng có sẵn đó và nếu gộp chung câu lệnh này lên cùng với câu lệnh tính tồn kho thì câu lệnh mới sẽ sửa như thế nào vậy bạn?
 
Cảm ơn bạn nhiều, đúng như vậy OT chỉ cần câu lệnh truy vấn trong SQL dạng này ạ.

Úi nghĩa là phải cần thêm một bảng danh mục mã hàng để tham chiếu qua ạ.
Xin lỗi OT sơ ý cứ nghĩ sử dụng câu lệnh where mã hàng =N'.. '
Giờ OT mới hiểu thêm nếu lấy tất cả mã hàng là phải có thêm bảng danh mục mã hàng.
Cảm ơn bạn nhiều, ngày mai có điều kiện OT sẽ thử và thông tin lại ở đây ạ.
Chúc bạn ngủ ngon.
Thực ra vẫn còn một cách làm khác là join 2 bảng TDK và NX lại rồi pivot
Bài đã được tự động gộp:

Cảm ơn bạn nhiều ạ,
Đúng là DB có bảng danh mục hàng thường gọi là chung là masterItem ạ.
Giả sử không sử dụng bảng danh mục hàng có sẵn đó và nếu gộp chung câu lệnh này lên cùng với câu lệnh tính tồn kho thì câu lệnh mới sẽ sửa như thế nào vậy bạn?
Bạn copy 2 câu đó lại chạy chung là được, câu tạo Category chạy trước
 
Thực ra vẫn còn một cách làm khác là join 2 bảng TDK và NX lại rồi pivot
Ôi, bạn biết cách nào thì chỉ thêm cho OT với ạ, cách nào dễ ứng dụng và xuất ra được báo cáo theo nhu cầu gần gũi và dễ dàng sử dụng thì OT sẽ tham khảo để ứng dụng ạ.
Bài đã được tự động gộp:

Thực ra vẫn còn một cách làm khác là join 2 bảng TDK và NX lại rồi pivot
Bài đã được tự động gộp:


Bạn copy 2 câu đó lại chạy chung là được, câu tạo Category chạy trước
OT đã từng thử chạy nhiều câu lệnh truy vấn cùng lúc nhưng đó là trong SQL, mỗi câu lệnh select độc lập sẽ cho ra kết quả của mỗi bản, như vậy nhiều câu select riêng sẽ cho ra nhiều bảng dữ liệu kết quả. Còn trong code Excel sau khi thực hiện câu lệnh kết nối đến DB thì có thể chạy kiểu đó được không ạ, hay phải ghép chúng lại thành một chuỗi.
sáng mai đến cơ quan OT mới có điều kiện để thử được ạ.
Cảm ơn bạn nhiều.
 
Lần chỉnh sửa cuối:
Ôi, bạn biết cách nào thì chỉ thêm cho OT với ạ, cách nào dễ ứng dụng và xuất ra được báo cáo theo nhu cầu gần gũi và dễ dàng sử dụng thì OT sẽ tham khảo để ứng dụng ạ.
Bài đã được tự động gộp:


OT đã từng thử chạy nhiều câu lệnh truy vấn cùng lúc nhưng đó là trong SQL, còn trong code Excel sau khi thực hiện câu lệnh kết nối đến DB thì có thể chạy kiểu đó được không ạ, hay phải ghép chúng lại thành một chuỗi.
sáng mai đến cơ quan OT mới có điều kiện để thử được ạ.
Cảm ơn bạn nhiều.
Trong ADO hình như việc ghép 2 câu lệnh như vậy chạy không được , bạn có thể test thông qua connect SQL của excel được nó cho phép ghép 2 câu lệnh như vậy
Đây là trường hợp dùng pivot (tôi cũng chưa test chỉ viết trên word)

Mã:
select a.[kieu],a.[ma_hang], a.[so_luong]
from
(
    select 'TDK' [kieu],a.[ma_hang], a.[so_luong]
    from [tdk] a
    union all
    select a.[kieu],a.[ma_hang], a.[so_luong]
    from [nx] a
) a
pivot
(
sum([so_luong])
for [kieu] in ('tdk','n','x')
) b
 
Trong ADO hình như việc ghép 2 câu lệnh như vậy chạy không được , bạn có thể test thông qua connect SQL của excel được nó cho phép ghép 2 câu lệnh như vậy
Đây là trường hợp dùng pivot (tôi cũng chưa test chỉ viết trên word)

Mã:
select a.[kieu],a.[ma_hang], a.[so_luong]
from
(
    select 'TDK' [kieu],a.[ma_hang], a.[so_luong]
    from [tdk] a
    union all
    select a.[kieu],a.[ma_hang], a.[so_luong]
    from [nx] a
) a
pivot
(
sum([so_luong])
for [kieu] in ('tdk','n','x')
) b

Dạ
Trong ADO hình như việc ghép 2 câu lệnh như vậy chạy không được , bạn có thể test thông qua connect SQL của excel được nó cho phép ghép 2 câu lệnh như vậy
Đây là trường hợp dùng pivot (tôi cũng chưa test chỉ viết trên word)

Mã:
select a.[kieu],a.[ma_hang], a.[so_luong]
from
(
    select 'TDK' [kieu],a.[ma_hang], a.[so_luong]
    from [tdk] a
    union all
    select a.[kieu],a.[ma_hang], a.[so_luong]
    from [nx] a
) a
pivot
(
sum([so_luong])
for [kieu] in ('tdk','n','x')
) b

Cảm ơn bạn rất nhiều, OT cũng nghĩ trong codeExcel không chạy kiểu đó lên bài viết phía trên OT có sửa lại nói rõ hơn khi nhiều câu lệnh truy vấn cùng lúc trong SQL.
Cảm ơn bạn nhiểu những kiến thức thức rất cần thiết cho OT mà OT không thể học và nhớ được.
OT ngủ đây ạ, chúc bạn và mọi người ngon giấc.
 
Tôi không có dữ liệu để test nên không biết chạy được không, nếu SQL thì tôi viết vầy (giả sử bạn có một bảng danh mục hàng [Category])

Mã:
select a.[ma_hang],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang]
left join [NX] c on a.[ma_hang]=c.[ma_hang]
group by a.[ma_hang]
order by a.[ma_hang]

Xin chào excel_lv1.5
OT đã thêm bảng DMHH (danh mục hàng)
1602036096259.png
Và thử code bài #156 & #164 thì cả 2 code chạy đều bị lỗi, nhờ các bạn xem & giúp đỡ OT với ạ:
Mã:
'Error: Unrecognized keyword WHEN.
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "sum(b.[so_luong]) [tdk]," & _
            "sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap]," & _
            "sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat]," & _
            "sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton] " & _
            "from [DMHH] a " & _
            "left join [TDK] b on a.[ma_hang]=b.[ma_hang] " & _
            "left join [NX] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("G1").CopyFromRecordset .Execute(strSQL)
    End With
End Sub

'Error: Syntax error in FROM clause.
Sub Xuat_Nhap_Ton_SQL_2()
    Dim strSQL As String
       strSQL = "select a.[kieu],a.[ma_hang], a.[so_luong] " & _
                "from (" & _
                      "select 'TDK' [kieu],a.[ma_hang], a.[so_luong] from [tdk] a " & _
                      "Union all " & _
                      "select a.[kieu],a.[ma_hang], a.[so_luong] from [nx] a " & _
                      ") a " & _
                "pivot " & _
                "(Sum ([so_luong])for [kieu] in ('tdk','n','x')) b"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("G1").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
 

File đính kèm

  • NXT_SQL.xlsm
    24.7 KB · Đọc: 16
Tôi không có dữ liệu để test nên không biết chạy được không, nếu SQL thì tôi viết vầy (giả sử bạn có một bảng danh mục hàng [Category])

Mã:
select a.[ma_hang],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang]
left join [NX] c on a.[ma_hang]=c.[ma_hang]
group by a.[ma_hang]
order by a.[ma_hang]
Chào Bạn,
Câu lệnh truy vấn này OT thử trong môi trường SQL, OK rồi ạ.
Xin hỏi thêm bạn nếu OT muốn truy vấn phân biệt theo một trường nữa (KHO_LUU_TRU) thì câu lệnh này sẽ phải sửa lại như thế nào ạ.
OT đã bổ sung trường 'KHO_LUU_TRU' vào bảng 'TDK' và 'NX' như ảnh kèm, nhờ bạn và mọi người xem giúp ạ:
1602040789470.png
 

File đính kèm

  • NXT_SQL_.xlsx
    12.3 KB · Đọc: 9
Xin hỏi thêm bạn nếu OT muốn truy vấn phân biệt theo một trường nữa (KHO_LUU_TRU) thì câu lệnh này sẽ phải sửa lại như thế nào ạ.
OT đã bổ sung trường 'KHO_LUU_TRU' vào bảng 'TDK' và 'NX' như ảnh kèm, nhờ bạn và mọi người xem giúp ạ:

:) Anh góp ý vụ tính tồn kho này chút nhé. Vì xem mấy bài ở trên em đưa dữ liệu đã trích xuất ra theo từng mã hàng rồi nên cách xử lý sẽ khác. Thông thường cái tác vụ báo cáo NXT là: tính NXT của các mã hàng (hoặc 1 mã hàng) trong khoảng thời gian nào đó cần truy vấn. Do đó tốt nhất là em nên đưa cái CSDL để tính NXT có các thông tin: tất cả các mã hàng, ngày tháng nhập xuất, kho; Tồn đầu kỳ của tất cả các mã hàng - kho tồn - tháng/năm tồn (bảng TDK theo tháng phải khong em?). Khi đó câu lệnh truy vấn sẽ đầy đủ hơn, kết quả trả về cũng đáp ứng như cầu nhiều hơn.
 
:) Anh góp ý vụ tính tồn kho này chút nhé. Vì xem mấy bài ở trên em đưa dữ liệu đã trích xuất ra theo từng mã hàng rồi nên cách xử lý sẽ khác. Thông thường cái tác vụ báo cáo NXT là: tính NXT của các mã hàng (hoặc 1 mã hàng) trong khoảng thời gian nào đó cần truy vấn. Do đó tốt nhất là em nên đưa cái CSDL để tính NXT có các thông tin: tất cả các mã hàng, ngày tháng nhập xuất, kho; Tồn đầu kỳ của tất cả các mã hàng - kho tồn - tháng/năm tồn (bảng TDK theo tháng phải khong em?). Khi đó câu lệnh truy vấn sẽ đầy đủ hơn, kết quả trả về cũng đáp ứng như cầu nhiều hơn.
Xin chào anh ongke0711,
Dạ vâng mới đầu OT cũng nghĩ như vậy nhưng OT thấy để ít trường như vậy để câu lệnh nó ngắn ạ nếu để nhiều trường sợ câu lệnh nó dài rồi rối lên.
Vậy OT sẽ bổ sung thêm 1 số trường ngày tháng (các trường cơ bản) sau đó gửi lại data lên đây nhờ anh và mọi người xem giúp ạ.
Cảm ơn anh đã góp ý ạ.
OT
 
Ôi, bạn biết cách nào thì chỉ thêm cho OT với ạ, cách nào dễ ứng dụng và xuất ra được báo cáo theo nhu cầu gần gũi và dễ dàng sử dụng thì OT sẽ tham khảo để ứng dụng ạ.
Bài đã được tự động gộp:


OT đã từng thử chạy nhiều câu lệnh truy vấn cùng lúc nhưng đó là trong SQL, mỗi câu lệnh select độc lập sẽ cho ra kết quả của mỗi bản, như vậy nhiều câu select riêng sẽ cho ra nhiều bảng dữ liệu kết quả. Còn trong code Excel sau khi thực hiện câu lệnh kết nối đến DB thì có thể chạy kiểu đó được không ạ, hay phải ghép chúng lại thành một chuỗi.
sáng mai đến cơ quan OT mới có điều kiện để thử được ạ.
Cảm ơn bạn nhiều.
Mỗi lần gửi thực thi SQL qua ADO trong Excel thì chỉ gửi 1 câu lệnh mà thôi
Ghép thì có UNION, JOIN... nhưng đó là ghép thành 1 lệnh

Muốn nhiều lệnh thì cần gửi thực thi nhiều lần (dùng chung 1 kết nối)
 
Xin chào excel_lv1.5
OT đã thêm bảng DMHH (danh mục hàng)
View attachment 246920
Và thử code bài #156 & #164 thì cả 2 code chạy đều bị lỗi, nhờ các bạn xem & giúp đỡ OT với ạ:
Mã:
'Error: Unrecognized keyword WHEN.
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "sum(b.[so_luong]) [tdk]," & _
            "sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap]," & _
            "sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat]," & _
            "sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton] " & _
            "from [DMHH] a " & _
            "left join [TDK] b on a.[ma_hang]=b.[ma_hang] " & _
            "left join [NX] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("G1").CopyFromRecordset .Execute(strSQL)
    End With
End Sub

'Error: Syntax error in FROM clause.
Sub Xuat_Nhap_Ton_SQL_2()
    Dim strSQL As String
       strSQL = "select a.[kieu],a.[ma_hang], a.[so_luong] " & _
                "from (" & _
                      "select 'TDK' [kieu],a.[ma_hang], a.[so_luong] from [tdk] a " & _
                      "Union all " & _
                      "select a.[kieu],a.[ma_hang], a.[so_luong] from [nx] a " & _
                      ") a " & _
                "pivot " & _
                "(Sum ([so_luong])for [kieu] in ('tdk','n','x')) b"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("G1").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Bạn phải viết theo kiểu Excel, ví dụ
Mã:
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "sum(b.[so_luong])  ," & _
            "sum(-(c.[kieu]='N')* c.[so_luong])," & _
            "sum(-(c.[kieu]='X')* c.[so_luong])," & _
            "sum(iif(isnull(b.[so_luong]),0,b.[so_luong]))+sum(-(c.[kieu]='N')*c.[so_luong])-sum(-(c.[kieu]='X')* c.[so_luong])" & _
            "from ([DMHH$] a " & _
            "left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) " & _
            "left join [NX$] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A6").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Chú ý lệnh:
sum(iif(isnull(b.[so_luong]),0,b.[so_luong]))
 
Bạn phải viết theo kiểu Excel, ví dụ
Mã:
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "sum(b.[so_luong])  ," & _
            "sum(-(c.[kieu]='N')* c.[so_luong])," & _
            "sum(-(c.[kieu]='X')* c.[so_luong])," & _
            "sum(iif(isnull(b.[so_luong]),0,b.[so_luong]))+sum(-(c.[kieu]='N')*c.[so_luong])-sum(-(c.[kieu]='X')* c.[so_luong])" & _
            "from ([DMHH$] a " & _
            "left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) " & _
            "left join [NX$] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A6").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Chú ý lệnh:
sum(iif(isnull(b.[so_luong]),0,b.[so_luong]))
Code chạy được rồi Bác HieuCD, con cảm ơn Bác.
Nhưng mà sao TDK của con chỉ có 150 mà code chạy ra tận 4800 , Bác xem giúp con với ạ.
 
Code chạy được rồi Bác HieuCD, con cảm ơn Bác.
Nhưng mà sao TDK của con chỉ có 150 mà code chạy ra tận 4800 , Bác xem giúp con với ạ.
Không hiểu tại sao luôn :(
Bạn @VetMini giải thích dùm mình
Mã:
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "max(b.[so_luong])  ," & _
            "sum(-(c.[kieu]='N')* c.[so_luong])," & _
            "sum(-(c.[kieu]='X')* c.[so_luong])," & _
            "max(iif(isnull(b.[so_luong]),0,b.[so_luong]))+sum(-(c.[kieu]='N')*c.[so_luong])-sum(-(c.[kieu]='X')* c.[so_luong])" & _
            "from ([DMHH$] a " & _
            "left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) " & _
            "left join [NX$] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A6").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
 
Không hiểu tại sao luôn :(
Mã:
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "max(b.[so_luong])  ," & _
            "sum(-(c.[kieu]='N')* c.[so_luong])," & _
            "sum(-(c.[kieu]='X')* c.[so_luong])," & _
            "max(iif(isnull(b.[so_luong]),0,b.[so_luong]))+sum(-(c.[kieu]='N')*c.[so_luong])-sum(-(c.[kieu]='X')* c.[so_luong])" & _
            "from ([DMHH$] a " & _
            "left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) " & _
            "left join [NX$] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A6").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Con cảm ơn Bác, code chạy ra kết quả đúng ý con rồi.
Hic, Bác không hiểu chắc con xác định khỏi tìm hiểu luôn ạ :rolleyes:
 
Chào Bạn,
Câu lệnh truy vấn này OT thử trong môi trường SQL, OK rồi ạ.
Xin hỏi thêm bạn nếu OT muốn truy vấn phân biệt theo một trường nữa (KHO_LUU_TRU) thì câu lệnh này sẽ phải sửa lại như thế nào ạ.
OT đã bổ sung trường 'KHO_LUU_TRU' vào bảng 'TDK' và 'NX' như ảnh kèm, nhờ bạn và mọi người xem giúp ạ:
View attachment 246931
Vậy bên bảng DMHH bảng cũng phải có kho luôn nhe bạn, tôi sửa lại trong môi trường SQL Server và khi DMHH có thêm cột kho
Mã:
select a.[ma_hang],a.[KHO_LUU_TRU],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang] and a.[KHO_LUU_TRU]=b.[KHO_LUU_TRU]
left join [NX] c on a.[ma_hang]=c.[ma_hang] and a.[KHO_LUU_TRU]=c.[KHO_LUU_TRU]
group by a.[ma_hang], a.[KHO_LUU_TRU]
order by a.[ma_hang], a.[KHO_LUU_TRU]
Còn connect qua SQL của Access bạn tùy biến lại
 
Không hiểu tại sao luôn :(
Bạn @VetMini giải thích dùm mình
Mã:
Sub Xuat_Nhap_Ton_SQL()
    Dim strSQL As String
    strSQL = "select a.[ma_hang]," & _
            "max(b.[so_luong])  ," & _
            "sum(-(c.[kieu]='N')* c.[so_luong])," & _
            "sum(-(c.[kieu]='X')* c.[so_luong])," & _
            "max(iif(isnull(b.[so_luong]),0,b.[so_luong]))+sum(-(c.[kieu]='N')*c.[so_luong])-sum(-(c.[kieu]='X')* c.[so_luong])" & _
            "from ([DMHH$] a " & _
            "left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) " & _
            "left join [NX$] c on a.[ma_hang]=c.[ma_hang] " & _
            "group by a.[ma_hang] " & _
            "order by a.[ma_hang]"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet6.Range("A6").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Bác ơi câu lệnh này của Bác, 2 cái dấu "()" có gì khác biệt giữa Excel và SQL không ?
from ([DMHH$] a left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) left join [NX$] c on a.[ma_hang]=c.[ma_hang]
mà con thấy đưa vào SQL nó kỳ quá ạ



Vậy bên bảng DMHH bảng cũng phải có kho luôn nhe bạn, tôi sửa lại trong môi trường SQL Server và khi DMHH có thêm cột kho
Mã:
select a.[ma_hang],a.[KHO_LUU_TRU],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang] and a.[KHO_LUU_TRU]=b.[KHO_LUU_TRU]
left join [NX] c on a.[ma_hang]=c.[ma_hang] and a.[KHO_LUU_TRU]=c.[KHO_LUU_TRU]
group by a.[ma_hang], a.[KHO_LUU_TRU]
order by a.[ma_hang], a.[KHO_LUU_TRU]
Còn connect qua SQL của Access bạn tùy biến lại
Cảm ơn bạn nhiều ạ, OT sẽ kiểm tra và thông tin lại ạ
Bài đã được tự động gộp:

Vậy bên bảng DMHH bảng cũng phải có kho luôn nhe bạn, tôi sửa lại trong môi trường SQL Server và khi DMHH có thêm cột kho
Mã:
select a.[ma_hang],a.[KHO_LUU_TRU],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang] and a.[KHO_LUU_TRU]=b.[KHO_LUU_TRU]
left join [NX] c on a.[ma_hang]=c.[ma_hang] and a.[KHO_LUU_TRU]=c.[KHO_LUU_TRU]
group by a.[ma_hang], a.[KHO_LUU_TRU]
order by a.[ma_hang], a.[KHO_LUU_TRU]
Còn connect qua SQL của Access bạn tùy biến lại
@excel_lv1.5 cảm ơn bạn đã quan tâm và giúp đỡ OT.
Bảng 'DMHH' không có Kho bạn ạ, mà nó nằm một bảng khác nữa ví dụ là bảng 'DMKHO' bạn ạ T_T
 
Bác ơi câu lệnh này của Bác, 2 cái dấu "()" có gì khác biệt giữa Excel và SQL không ?
from ([DMHH$] a left join [TDK$] b on a.[ma_hang]=b.[ma_hang]) left join [NX$] c on a.[ma_hang]=c.[ma_hang]
mà con thấy đưa vào SQL nó kỳ quá ạ




Cảm ơn bạn nhiều ạ, OT sẽ kiểm tra và thông tin lại ạ
Bài đã được tự động gộp:


@excel_lv1.5 cảm ơn bạn đã quan tâm và giúp đỡ OT.
Bảng 'DMHH' không có Kho bạn ạ, mà nó nằm một bảng khác nữa ví dụ là bảng 'DMKHO' bạn ạ T_T
Mình nghỉ nên có () mối liên kết sẽ tường minh hơn
 
Vậy bên bảng DMHH bảng cũng phải có kho luôn nhe bạn, tôi sửa lại trong môi trường SQL Server và khi DMHH có thêm cột kho
Mã:
select a.[ma_hang],a.[KHO_LUU_TRU],
sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end)  [ton]
from [category] a
left join [TDK] b on a.[ma_hang]=b.[ma_hang] and a.[KHO_LUU_TRU]=b.[KHO_LUU_TRU]
left join [NX] c on a.[ma_hang]=c.[ma_hang] and a.[KHO_LUU_TRU]=c.[KHO_LUU_TRU]
group by a.[ma_hang], a.[KHO_LUU_TRU]
order by a.[ma_hang], a.[KHO_LUU_TRU]
Còn connect qua SQL của Access bạn tùy biến lại
Xin chào excel_lv1.5
OT test thử câu lệnh truy vấn trên của bạn và đã biết cách tham chiếu thêm đến bảng DMKHO, nhưng có một vấn đề đó là cái đoạn:
"sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [ton]"
OT đang thấy ra kết quả không đúng ạ.
Ví dụ OT chỉ kiểm tra tồn đầu kỳ và so sánh với câu lệnh "sum(b.[so_luong]) [tdk]" dữ liệu là "150" nhưng kết quả chạy câu lệnh này là "33600"
Bạn xem giúp với ạ
 
Xin chào excel_lv1.5
OT test thử câu lệnh truy vấn trên của bạn và đã biết cách tham chiếu thêm đến bảng DMKHO, nhưng có một vấn đề đó là cái đoạn:
"sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [ton]"
OT đang thấy ra kết quả không đúng ạ.
Ví dụ OT chỉ kiểm tra tồn đầu kỳ và so sánh với câu lệnh "sum(b.[so_luong]) [tdk]" dữ liệu là "150" nhưng kết quả chạy câu lệnh này là "33600"
Bạn xem giúp với ạ
Bạn gửi cho tôi câu lệnh bạn điều chỉnh tôi xem thử!
 
Xin chào excel_lv1.5
OT test thử câu lệnh truy vấn trên của bạn và đã biết cách tham chiếu thêm đến bảng DMKHO, nhưng có một vấn đề đó là cái đoạn:
"sum(b.[so_luong]) [tdk],
sum(case when c.[kieu]='n' then c.[so_luong] else 0 end) [nhap],
sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [xuat],
sum(b.[so_luong])+sum(case when c.[kieu]='n' then c.[so_luong] else 0 end)-sum(case when c.[kieu]='x' then c.[so_luong] else 0 end) [ton]"
OT đang thấy ra kết quả không đúng ạ.
Ví dụ OT chỉ kiểm tra tồn đầu kỳ và so sánh với câu lệnh "sum(b.[so_luong]) [tdk]" dữ liệu là "150" nhưng kết quả chạy câu lệnh này là "33600"
Bạn xem giúp với ạ
Chỗ trống như hình là "A" hay trống vậy em?

1602055092561.png
 
Web KT
Back
Top Bottom