SQL excel chỉ lấy số liệu của 1 dòng, nếu có các trường khác giống nhau

Liên hệ QC

Doanh7

Thành viên mới
Tham gia
13/7/16
Bài viết
32
Được thích
2
1608866012377.png
Nhờ các bác giúp em
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
 

File đính kèm

  • 1608866012377.png
    1608866012377.png
    171.7 KB · Đọc: 10
  • SQL Excel hỏi.xlsx
    12 KB · Đọc: 17
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
Hình như trong file số lượng nhập không hẳn là lấy 1 dòng cũng không phải lấy tất cả thì phải
1608867131436.png
 
Hình như trong file số lượng nhập không hẳn là lấy 1 dòng cũng không phải lấy tất cả thì phải
"Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
Lý ra phải thêm điều kiện số chứng từ nữa, bởi một ngày có thể nhập nhiều hơn 1 lần 1 sản phẩm cùng loại.
---
Đấy, Văn quan trọng không kém Toán đó. Biết 1 cộng 1 bằng 2, nhưng Văn kém không biết nêu kết quả ra sao cũng mệt lắm ấy.
 
"Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
Trong file nếu để được kết quả số lượng nhập thì phải cộng 1 dòng của ngày 1 và 1 dòng của ngày 2 thì mới đúng là 1100 như trong file ghi đó bác,nên mới khó hiểu là rõ là điều kiện là phân theo ngày và sản phẩm sao lại cộng hai ngày với nhau được.còn chỉ tính sp A của ngày 1 số lượng nhập là 400 ,ngày hai là 2000
 
Trong file nếu để được kết quả số lượng nhập thì phải cộng 1 dòng của ngày 1 và 1 dòng của ngày 2 thì mới đúng là 1100 như trong file ghi đó bác,nên mới khó hiểu là rõ là điều kiện là phân theo ngày và sản phẩm sao lại cộng hai ngày với nhau được.còn chỉ tính sp A của ngày 1 số lượng nhập là 400 ,ngày hai là 2000
Tức là:
1/ "Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
2/ Có bao nhiêu ngày nhập sản phẩm đó thì tính tổng số lượng nhập lại.
 
Tức là:
1/ "Lấy số lượng nhập của 1 dòng trong một ngày của một sản phẩm".
2/ Có bao nhiêu ngày nhập sản phẩm đó thì tính tổng số lượng nhập lại.
Đúng ý em đó bác.
Không cần số chứng từ vì chắc chắc 1 ngày 1 sp chỉ xuất hiện 1 lần (data này được xử lý 1 lần rồi)
-> có cách nào không bác
 
Đúng ý em đó bác.
Không cần số chứng từ vì chắc chắc 1 ngày 1 sp chỉ xuất hiện 1 lần (data này được xử lý 1 lần rồi)
-> có cách nào không bác
Mã:
Option Explicit

Sub Tong_Hop()
Dim SQL(), KQ()
Dim i As Long, K As Long, Rws As Long, DK  As String, MH As String, Date1 As Date
Dim Dic As Object

Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    SQL = .Range("C4", .Range("C" & Rows.Count).End(xlUp)).Resize(, 5).Value
    ReDim KQ(1 To UBound(SQL), 1 To 4)
    For i = 1 To UBound(SQL)
                MH = Trim(SQL(i, 2))
                DK = Trim(SQL(i, 1)) & Trim(SQL(i, 2))
            If Not Dic.exists(MH) Then
                       K = K + 1
                Dic.Add MH, K
                Dic.Add DK, SQL(i, 1)
                KQ(K, 1) = SQL(i, 2)
                KQ(K, 2) = SQL(i, 3)
                KQ(K, 3) = SQL(i, 5)
            Else
                Rws = Dic.Item(MH)
                Date1 = Dic.Item(DK)
                        KQ(Rws, 3) = KQ(Rws, 3) + SQL(i, 5)
                If SQL(i, 1) <> Date1 Then
                        KQ(Rws, 2) = KQ(Rws, 2) + SQL(i, 3)
                        Dic.Item(DK) = Dic.Item(DK) & SQL(i, 1)
                End If
            End If
            
                
    Next
    For i = 1 To K
        KQ(i, 4) = KQ(i, 3) / KQ(i, 2)
    Next
    .Range("L18").Resize(K, 4) = KQ
End With
Set Dic = Nothing
End Sub
Vậy thử code này
 

File đính kèm

  • SQL Excel hỏi.xlsm
    19.4 KB · Đọc: 16
Bài #7 thấy bảo là đã xử lý qua một bước rồi thì chắc là đã đưa ra file excel . chỉ cần thống kê lại thôi chứ bác,đoán thế nên mới làm không biết có đúng vậy không nữa
 
Dữ liệu này nếu sắp xếp Key1 =tên sản phẩm, Key2 = ngày thì code không cần dùng Dic.
 
View attachment 251803
Nhờ các bác giúp em
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
Thử code sau, tôi không chắc là sẽ đúng yêu cầu của bạn.

Mã:
Sub LayDL_HLMT1()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
        Sheet1.Range("L17").CopyFromRecordset .Execute("Select F2,Sum(F3),Sum(F5),Sum(F5)/Sum(F3) From (Select Distinct F2,F3,0 As F5 from [Sheet1$A4:G15] Union All Select F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F2) Group By F2")
    End With
End Sub
 
Bạn dùng thử code sau, vào Tool - Reference chọn MS ActiveX Data Object
Mã:
Sub xxx()
Dim cn As New Connection, rs As New Recordset, s As String
s = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
cn.Open s
s = "SELECT Ten,sum(SLN) as SLN,sum(SoLoi) as SoLoi,sum(SoLoi)/sum(SLN) as TyLe FROM (SELECT F2 as Ten,max(F3) as SLN,sum(F5) as SoLoi FROM [Sheet1$C4:G15] GROUP BY F1,F2) GROUP BY Ten"
rs.Open s, cn
Sheet1.Range("A20").CopyFromRecordset rs
rs.Close
cn.Close
End Sub
 
View attachment 251803
Nhờ các bác giúp em
Tham khảo File đính kèm:
1. Nếu "ngày" & "Tên Sản phẩm" của các dòng giống nhau
-> Thì "số lượng nhập" chỉ lấy của 1 dòng, nhưng số lượng lỗi thì lấy của tất.
"Tham khảo kết quả mong muốn bên trên"
-> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?
Cái này dùng Pivot cũng được ạ. Chỗ công thức item ấy ạ, add được thêm cột công thức
 
VBA Excel không có SQL. Khỏi nói chuyện giải quyết.

Chỉ khi dùng đến ADODB thì cái COM này nó mới dùng SQL để truy vấn dữ liệu.
Nó là sql - ADODB đó bác
Bài đã được tự động gộp:

Mã:
Option Explicit

Sub Tong_Hop()
Dim SQL(), KQ()
Dim i As Long, K As Long, Rws As Long, DK  As String, MH As String, Date1 As Date
Dim Dic As Object

Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    SQL = .Range("C4", .Range("C" & Rows.Count).End(xlUp)).Resize(, 5).Value
    ReDim KQ(1 To UBound(SQL), 1 To 4)
    For i = 1 To UBound(SQL)
                MH = Trim(SQL(i, 2))
                DK = Trim(SQL(i, 1)) & Trim(SQL(i, 2))
            If Not Dic.exists(MH) Then
                       K = K + 1
                Dic.Add MH, K
                Dic.Add DK, SQL(i, 1)
                KQ(K, 1) = SQL(i, 2)
                KQ(K, 2) = SQL(i, 3)
                KQ(K, 3) = SQL(i, 5)
            Else
                Rws = Dic.Item(MH)
                Date1 = Dic.Item(DK)
                        KQ(Rws, 3) = KQ(Rws, 3) + SQL(i, 5)
                If SQL(i, 1) <> Date1 Then
                        KQ(Rws, 2) = KQ(Rws, 2) + SQL(i, 3)
                        Dic.Item(DK) = Dic.Item(DK) & SQL(i, 1)
                End If
            End If
           
               
    Next
    For i = 1 To K
        KQ(i, 4) = KQ(i, 3) / KQ(i, 2)
    Next
    .Range("L18").Resize(K, 4) = KQ
End With
Set Dic = Nothing
End Sub
Vậy thử code này
Code này thì chương trình sẽ rất chậm.
* data đến vài nghìn dòng
* yêu cầu trên chỉ 1 mắt xích trong câu lệch tổng thể
Bài đã được tự động gộp:

Cái e hỏi chỉ là 1 mắt xích trong các câu lệnh tính toán sql khác(còn nhiều sự kết hợp khác) nên em cần giải quyết bằng SQL.
e có nghĩ ra cách làm 1 cột phụ số lượng xuất hiện của mỗi sp, trong câu lệnh sql sẽ chia cho cộ này. Nhưng e muốn xem có cánh nào khac hay hơn khoing
 
Lần chỉnh sửa cuối:
Nó là sql - ADODB đó bác
Bài đã được tự động gộp:


Code này thì chương trình sẽ rất chậm.
* data đến vài nghìn dòng
* yêu cầu trên chỉ 1 mắt xích trong câu lệch tổng thể
Bài đã được tự động gộp:


Cái e hỏi chỉ là 1 mắt xích trong các câu lệnh tính toán sql khác(còn nhiều sự kết hợp khác) nên em cần giải quyết bằng SQL.
e có nghĩ ra cách làm 1 cột phụ số lượng xuất hiện của mỗi sp, trong câu lệnh sql sẽ chia cho cộ này. Nhưng e muốn xem có cánh nào khac hay hơn khoing
Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíu
Mã:
Sub LayDL()
    Dim strSQL$
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
        strSQL = "(Select Distinct F1 & ""_"" & F2 as t1 ,F3 as t2 ,0 As t3 from [Sheet1$A4:G15] Union All " & _
                "Select F1 & ""_"" & F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F1 & ""_"" & F2)"
        strSQL = "Select Right(t1,1) ,Sum(t2) as a2,Sum(t3) as a3 ,a3/a2 From " & strSQL & " Group By right(t1,1)"
        Sheet1.Range("L17").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
 
Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíu
Mã:
Sub LayDL()
    Dim strSQL$
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=No"";Data Source=" & ThisWorkbook.FullName
        strSQL = "(Select Distinct F1 & ""_"" & F2 as t1 ,F3 as t2 ,0 As t3 from [Sheet1$A4:G15] Union All " & _
                "Select F1 & ""_"" & F2,0,Sum(F5) from [Sheet1$A4:G15] Group By F1 & ""_"" & F2)"
        strSQL = "Select Right(t1,1) ,Sum(t2) as a2,Sum(t3) as a3 ,a3/a2 From " & strSQL & " Group By right(t1,1)"
        Sheet1.Range("L17").CopyFromRecordset .Execute(strSQL)
    End With
End Sub
Cho em hỏi chút là sao trong lệnh tìm kiếm mình cứ F1, F2, F3....Em không hiểu vì thường SQL là lấy tiêu đề còn ở đây các F này là gì ạ ?
 
Web KT
Back
Top Bottom