Truy vấn trong SQL?

Liên hệ QC
Dạ,làm phiền anh Hai Lúa Miền Tây,viết giúp OT cụ thể câu lệnh select này với ạ.
OT cảm ơn anh ạ.
Em thử code sau nhé:
Mã:
Sub GomDL_HLMT()
    Dim strSQL As String
    strSQL = "Select CODE,INW,OUTW,QTY,'' AS INW2,'' AS OUTW2,0 AS QTY2,TYPE  from [S$] WHERE TYPE=1 UNION ALL Select CODE,'','',0,INW,OUTW,QTY,TYPE  from [S$] WHERE TYPE=2"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select CODE,INW,OUTW,SUM(QTY),INW2,OUTW2,SUM(QTY2),TYPE FROM (" & strSQL & ") GROUP BY CODE,TYPE,INW,OUTW,INW2,OUTW2")
    End With
   
End Sub
 
Em thử code sau nhé:
Mã:
Sub GomDL_HLMT()
    Dim strSQL As String
    strSQL = "Select CODE,INW,OUTW,QTY,'' AS INW2,'' AS OUTW2,0 AS QTY2,TYPE  from [S$] WHERE TYPE=1 UNION ALL Select CODE,'','',0,INW,OUTW,QTY,TYPE  from [S$] WHERE TYPE=2"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select CODE,INW,OUTW,SUM(QTY),INW2,OUTW2,SUM(QTY2),TYPE FROM (" & strSQL & ") GROUP BY CODE,TYPE,INW,OUTW,INW2,OUTW2")
    End With
  
End Sub
Lơi hại , lợi hại quá, ngôn SQL thật tuyệt vời.
Cảm ơn anh Hai Lúa nhiều ạ
 
Nếu như tôi thì tôi làm báo cáo bằng CROSSTAB Query như hình sau:

View attachment 246847

Bởi vì có thể trong cột TYPE có nhiều loại mà ta chưa biết nó là loại nào.
" CROSSTAB Query " là gì vậy anh Hai Lúa? Nó có select như kiểu câu lệnh bài #142 của anh không ạ?
Nhìn kết quả đúng là gọn và dễ hiểu hơn báo cáo trên của OT ạ.
Úi trời,câu lệnh #142 của anh mà OT đưa vào áp dụng thử thêm nhiều trường và thêm các điều kiện lọc ngày,tháng,mã hàng.... mà câu lệnh dài quá :D
Cảm ơn anh Hai Lúa đã giúp đỡ.
 
" CROSSTAB Query " là gì vậy anh Hai Lúa? Nó có select như kiểu câu lệnh bài #142 của anh không ạ?
Nhìn kết quả đúng là gọn và dễ hiểu hơn báo cáo trên của OT ạ.
Úi trời,câu lệnh #142 của anh mà OT đưa vào áp dụng thử thêm nhiều trường và thêm các điều kiện lọc ngày,tháng,mã hàng.... mà câu lệnh dài quá :D
Cảm ơn anh Hai Lúa đã giúp đỡ.
Do vậy anh mới nói phải dùng Crosstab Query như bài #144, em thử code như sau nhé:

Mã:
Sub GomDL_HLMT1()
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet2.Range("A7").CopyFromRecordset .Execute("TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE")
    End With
    
End Sub
 
Do vậy anh mới nói phải dùng Crosstab Query như bài #144, em thử code như sau nhé:

Mã:
Sub GomDL_HLMT1()
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName)
        Sheet2.Range("A7").CopyFromRecordset .Execute("TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE")
    End With
   
End Sub
Cách này đúng là ngắn hơn cách trên nhiều, bớt được hẳn 2 câu lệnh Select dài ngoằng :D .
Cảm ơn anh đã chỉ cho OT thêm một cách ạ.
OT chúc anh Hai Lúa sức khỏe tốt.
 
Cách này đúng là ngắn hơn cách trên nhiều, bớt được hẳn 2 câu lệnh Select dài ngoằng :D .
Cảm ơn anh đã chỉ cho OT thêm một cách ạ.
OT chúc anh Hai Lúa sức khỏe tốt.
Thêm cho em cái tiêu đề vào luôn nhé, bây giờ không cần quan tâm đến cột TYPE có bao nhiêu loại theo chuẩn.

Mã:
Sub GomDL_HLMT2()
    Dim fldName, i As Byte
    With CreateObject("ADODB.Recordset")
        .Open ("TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) AS TOTAL_QTY FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        For Each fldName In .Fields
            i = i + 1
            Sheet2.Cells(6, i) = fldName.Name
        Next
        Sheet2.Range("A7").CopyFromRecordset .DataSource
    End With
   
End Sub
 
Lần chỉnh sửa cuối:
Thêm cho em cái tiêu đề vào luôn nhé, bây giờ không cần quan tâm đến cột TYPE có bao nhiêu cột theo chuẩn.

Mã:
Sub GomDL_HLMT2()
    Dim fldName, i As Byte
    With CreateObject("ADODB.Recordset")
        .Open ("TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) AS TOTAL_QTY FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        For Each fldName In .Fields
            i = i + 1
            Sheet2.Cells(6, i) = fldName.Name
        Next
        Sheet2.Range("A7").CopyFromRecordset .DataSource
    End With
   
End Sub
:yahoo:
Code xịn xò quá , cảm ơn anh nhiều ạ.
 
Thêm cho em cái tiêu đề vào luôn nhé, bây giờ không cần quan tâm đến cột TYPE có bao nhiêu loại theo chuẩn.

Mã:
Sub GomDL_HLMT2()
...
        .Open ("TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) AS TOTAL_QTY FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
       ..
 
End Sub

CrossTab Query thường biến động số cột tuỳ theo dữ liệu (cụ thể là cột TYPE trong ví dụ này) do đó tôi thường đưa vô liệt kê đủ các cột TYPE vào câu lệnh SQL để cố định số cột TYPE, không trồi ra thụt vào :).

Mã:
"TRANSFORM SUM(QTY) SELECT CODE,INW,OUTW,SUM(QTY) AS TOTAL_QTY FROM [S$] GROUP BY CODE,TYPE,INW,OUTW PIVOT TYPE IN (1,2,3,4,5) "
 
Xin chào các bạn,
OT có 2 bảng dữ liệu ban đầu TDK(tồn đầu kỳ) & bảng NX (nhập xuất),nhờ các bạn xem và giúp đỡ câu lệnh truy vấn SQL để ra kết quả tại bảng NXT ạ:

1.Bảng TDK:
1601996658117.png
2.Bảng NX:
1601996783656.png

Kết quả mong muốn sau khi thực hiện câu lệnh truy vấn SQL ra kết quả như bảng NXT ạ:
1601996869775.png
 

File đính kèm

  • NXT_SQL.xlsx
    11.4 KB · Đọc: 6
Xin chào các bạn,
OT có 2 bảng dữ liệu ban đầu TDK(tồn đầu kỳ) & bảng NX (nhập xuất),nhờ các bạn xem và giúp đỡ câu lệnh truy vấn SQL để ra kết quả tại bảng NXT ạ:

1.Bảng TDK:
View attachment 246895
2.Bảng NX:
View attachment 246897

Kết quả mong muốn sau khi thực hiện câu lệnh truy vấn SQL ra kết quả như bảng NXT ạ:
View attachment 246898
Tôi có thể dùng power pivot cho bài này không bạn!
 
Tôi có thể dùng power pivot cho bài này không bạn!
Xin chào bạn,
Cảm ơn bạn đã quan tâm đến bài viết này của OT.
Dạ vâng bạn có thể sử dụng power pivot, hoặc Vba đều được ạ... các cách này sẽ giúp ích để OT tham khảo và ứng dụng sang vấn đề khác ạ.

Còn với trường hợp này OT cần câu lệnh truy vấn để lấy dữ liệu từ DB về ạ.
Rất mong được bạn và mọi người giúp đỡ.
 
Xin chào bạn,
Cảm ơn bạn đã quan tâm đến bài viết này của OT.
Dạ vâng bạn có thể sử dụng power pivot, hoặc Vba đều được ạ... các cách này sẽ giúp ích để OT tham khảo và ứng dụng sang vấn đề khác ạ.

Còn với trường hợp này OT cần câu lệnh truy vấn để lấy dữ liệu từ DB về ạ.
Rất mong được bạn và mọi người giúp đỡ.
Ah, tôi hiểu nhầm vấn đề, mà bạn connect với DB SQL Server hay Excel!
 
Ah, tôi hiểu nhầm vấn đề, mà bạn connect với DB SQL Server hay Excel!
Dạ OT kết nối với DB SQL Server ạ.
OT chỉ cần câu lệnh truy vấn và không lệnh kết nối và đóng kết nối đến DB nữa ạ.
Ví dụ như bài 142 ở trên OT có thể lấy câu lệnh "Select..." để sử dụng ạ.
còn các câu lệnh kết nối ADO trong excel mang tính test kết quả thay vì trên môi trường SQL thì test trên Excel ạ.
 
Dạ OT kết nối với DB SQL Server ạ.
OT chỉ cần câu lệnh truy vấn và không lệnh kết nối và đóng kết nối đến DB nữa ạ.
Ví dụ như bài 142 ở trên OT có thể lấy câu lệnh "Select..." để sử dụng ạ.
còn các câu lệnh kết nối ADO trong excel mang tính test kết quả thay vì trên môi trường SQL thì test trên Excel ạ.
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]
 
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]
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.
 
Lần chỉnh sửa cuối:
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]
Không cần bảng danh mục hàng được không bạn :)
 
Không cần bảng danh mục hàng được không bạn :)
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
 
Web KT
Back
Top Bottom