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
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ụ
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
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.
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.
Cùng file, dùng mảng tốc độ nhanh hơn ADO, Chỉnh code bài #12 tí xíu
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.