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

Chia sẻ bởi:hands
★★★★★
Quảng cáo

2626
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 ạ?

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
2627

"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.

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.

Đú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

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

www.giaiphapexcel.com/diendan/threads/sql-excel-ch%E1%BB%89-l%E1%BA%A5y-s%E1%BB%91-li%E1%BB%87u-c%E1%BB%A7a-1-d%C3%B2ng-n%E1%BA%BFu-c%C3%B3-c%C3%A1c-tr%C6%B0%E1%BB%9Dng-kh%C3%A1c-gi%E1%BB%91ng-nhau.153619/

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ
Khóa học SprinGO phù hợp

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ

Con người là một trong những yếu tố quan trọng của công ty, là tài sản quý giá của doanh nghiệp. Chính vì thế,...

Xem khóa học
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    -> SQL trong VBA Excel có các giải quyết yêu cầu này không ạ?

    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.

    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.
    Thử code sau, tôi không chắc là sẽ đúng yêu cầu của bạn.

    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

    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

    Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíu

    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ì ạ ?

    Nếu HDR=no thì không lấy tên cột, ado sẽ thêm tên các cột thành F1, F2… Vì tên cột trong đề bài là tiếng Việt có dấu không đưa vào vba được nên phải khai báo HDR=no.
    @chủ topic, với dữ liệu chỉ có khoảng 3000 dòng thì dùng phương pháp nào cũng được: ado, dictionary hay mảng đơn thuần. Tốc độ cũng không khác nhau mấy.

    F là Field = Tiêu đề / Trường đó.
    Cột đầu tiên tính từ trái sang phải của vùng dữ liệu ứng với F1…

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm