Giới hạn số dòng kết quả trả ra của lệnh sql

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
Dear các ace!

Như tiêu đề cho em hỏi:
1, vấn đề: Câu lệch SQL của em lấy dữ liệu từ 1 bảng tính Excel khác sắp sếp kết quả theo thứ tự giảm dần, và em chỉ cần lấy 10 giá trị đầu (10 dòng dữ liệu có giá trị lớn nhấ), Em đã dung “ Select Top 10 …” nhưng vấn đề là nếu các giá trị so sánh bằng nhau thì kết quả trả ra > 10 dòng, ví dụ có 20 mã cùng 1 giá trị nằm trong top 10 thì nó sẽ xuất ra cả 20 dòng
à các ACE cho em hỏi có cách nào để giới hạn chỉ lấy 10 dòng thôi không (SQL trong Excell ạ)

Em mới vọc vạch lên có gì sai các bác ném nhẹ tay
 
Dear các ace!

Như tiêu đề cho em hỏi:
1, vấn đề: Câu lệch SQL của em lấy dữ liệu từ 1 bảng tính Excel khác sắp sếp kết quả theo thứ tự giảm dần, và em chỉ cần lấy 10 giá trị đầu (10 dòng dữ liệu có giá trị lớn nhấ), Em đã dung “ Select Top 10 …” nhưng vấn đề là nếu các giá trị so sánh bằng nhau thì kết quả trả ra > 10 dòng, ví dụ có 20 mã cùng 1 giá trị nằm trong top 10 thì nó sẽ xuất ra cả 20 dòng
à các ACE cho em hỏi có cách nào để giới hạn chỉ lấy 10 dòng thôi không (SQL trong Excell ạ)

Em mới vọc vạch lên có gì sai các bác ném nhẹ tay
Nếu làm như bạn sẽ bỏ sót dữ liệu, hiếm ai làm vậy. Nếu có thể thì phải xét tiếp điều kiện nữa.
 
Dear các ace!

Như tiêu đề cho em hỏi:
1, vấn đề: Câu lệch SQL của em lấy dữ liệu từ 1 bảng tính Excel khác sắp sếp kết quả theo thứ tự giảm dần, và em chỉ cần lấy 10 giá trị đầu (10 dòng dữ liệu có giá trị lớn nhấ), Em đã dung “ Select Top 10 …” nhưng vấn đề là nếu các giá trị so sánh bằng nhau thì kết quả trả ra > 10 dòng, ví dụ có 20 mã cùng 1 giá trị nằm trong top 10 thì nó sẽ xuất ra cả 20 dòng
à các ACE cho em hỏi có cách nào để giới hạn chỉ lấy 10 dòng thôi không (SQL trong Excell ạ)

Em mới vọc vạch lên có gì sai các bác ném nhẹ tay
Select top 10 thì nó chỉ ra 10 kết quả thui chứ? bạn có nhầm không? Bạn đưa file mẫu lên để mọi người cùng xem và giúp
 
Select top 10 thì nó chỉ ra 10 kết quả thui chứ? bạn có nhầm không? Bạn đưa file mẫu lên để mọi người cùng xem và giúp
Tôi đoán là cái kết quả bạn ấy cần là 10 dòng dữ liệu, tuy nhiên cái kết quả trả về hơn 10 dòng vì có dòng giá trị giống nhau
 
Bạn dùng Distinct nhé
 
Tôi đoán là cái kết quả bạn ấy cần là 10 dòng dữ liệu, tuy nhiên cái kết quả trả về hơn 10 dòng vì có dòng giá trị giống nhau
Liệu có sự nhầm lẫn không anh, em kiểm tra lại vẫn thấy nếu select top 10 thì vẫn chỉ trả về 10 kết quả mặc dù có hàng tá giá trị giống nhau.
upload_2018-4-13_16-45-18.png
 
Liệu có sự nhầm lẫn không anh, em kiểm tra lại vẫn thấy nếu select top 10 thì vẫn chỉ trả về 10 kết quả mặc dù có hàng tá giá trị giống nhau.
View attachment 193921
Bạn đã chưa test kỹ, câu lệnh ở trên của bạn chỉ lấy ra 10 dòng trên cùng của dữ liệu, muốn lấy dữ liệu lớn hàng top thì phải sắp xếp nó lại theo ý muốn.
 
Dear các ace!

Như tiêu đề cho em hỏi:
1, vấn đề: Câu lệch SQL của em lấy dữ liệu từ 1 bảng tính Excel khác sắp sếp kết quả theo thứ tự giảm dần, và em chỉ cần lấy 10 giá trị đầu (10 dòng dữ liệu có giá trị lớn nhấ), Em đã dung “ Select Top 10 …” nhưng vấn đề là nếu các giá trị so sánh bằng nhau thì kết quả trả ra > 10 dòng, ví dụ có 20 mã cùng 1 giá trị nằm trong top 10 thì nó sẽ xuất ra cả 20 dòng
à các ACE cho em hỏi có cách nào để giới hạn chỉ lấy 10 dòng thôi không (SQL trong Excell ạ)

Em mới vọc vạch lên có gì sai các bác ném nhẹ tay
Thử lệnh
Mã:
"select top 10 f1 from (select  f1 from [Sheet1$A1:A30] order by  f1 Desc) "
 
Chưa giải quyết được mà bác. Giờ e sẽ test #11.
Trước em giải quyết tạm bằng cách chuyền data qua 1 mảng phụ rồi lấy ra excel. Nhưng nó làm chậm chương trình.
Quan trọng là bạn muốn lấy thế nào thôi, Cụ thể kết quả mong muốn
Nếu chỉ lấy 10 dòng --> sẽ sai tiêu chí top 10, nên SQL lấy đúng tiêu chí thì khác cái như bạn nghĩ thôi.

Nên trên kia đã đề cập là bạn phải thêm điều kiện vào
 
Chưa giải quyết được mà bác. Giờ e sẽ test #11.
Trước em giải quyết tạm bằng cách chuyền data qua 1 mảng phụ rồi lấy ra excel. Nhưng nó làm chậm chương trình.
Bài 11 cũng có cách đây ngần ấy năm vậy mà bạn cũng vẫn chưa thử? Tôi có cảm giác bạn chỉ viết bài hỏi nhưng không quan tâm mấy về câu trả lời.
 
Bài 11 cũng có cách đây ngần ấy năm vậy mà bạn cũng vẫn chưa thử? Tôi có cảm giác bạn chỉ viết bài hỏi nhưng không quan tâm mấy về câu trả lời.
Xin lỗi các bác vì đã không reply.
Như đã nói ở trên, do đã tìm được phương án tạm nên em sử dụng luôn.
Đến hôm nay xem lại mới thấy nên reply muộn.
Theo cách bài 11 thì giải được bài toán này rồi ạ. Nhưng em thấy bị chậm hơn 1 chút
Bài đã được tự động gộp:

Xin lỗi các bác vì đã không reply.
Như đã nói ở trên, do đã tìm được phương án tạm nên em sử dụng luôn.
Đến hôm nay xem lại mới thấy nên reply muộn.
Theo cách bài 11 thì giải được bài toán này rồi ạ. Nhưng em thấy bị chậm hơn 1 chút
Mã:
     sql_1 = " SELECT TOP 2 * FROM (SELECT [" & [Field_Wst3].Value & "] As [F_G]," & Key_Lot_B & " As [Lot_Input], sum( IIF(" & Rate_LRR_B & ">= " & TC_LRR & ", 1, 0) ) As [F_LRR]," _
            & "[F_LRR]/[Lot_Input] As [Rate_LRR], " & Check_PCRS_T _
            & " As [CheckPCS],sum( IIF(ISNULL([NG_PCS]) " & LoiCD_Khac & Dk_Tenloi & ", 0, [NG_PCS]) ) As [NGQTY], [NGQTY]/" & Check_PCRS_T & " as [RateNG]" _
            & " FROM [DATA$]" _
            & " " & DK_Date & Chuoi_DK_WST1 _
1607593614435.png
 
Xin lỗi các bác vì đã không reply.
Như đã nói ở trên, do đã tìm được phương án tạm nên em sử dụng luôn.
Đến hôm nay xem lại mới thấy nên reply muộn.
Theo cách bài 11 thì giải được bài toán này rồi ạ. Nhưng em thấy bị chậm hơn 1 chút
Bài đã được tự động gộp:


Mã:
     sql_1 = " SELECT TOP 2 * FROM (SELECT [" & [Field_Wst3].Value & "] As [F_G]," & Key_Lot_B & " As [Lot_Input], sum( IIF(" & Rate_LRR_B & ">= " & TC_LRR & ", 1, 0) ) As [F_LRR]," _
            & "[F_LRR]/[Lot_Input] As [Rate_LRR], " & Check_PCRS_T _
            & " As [CheckPCS],sum( IIF(ISNULL([NG_PCS]) " & LoiCD_Khac & Dk_Tenloi & ", 0, [NG_PCS]) ) As [NGQTY], [NGQTY]/" & Check_PCRS_T & " as [RateNG]" _
            & " FROM [DATA$]" _
            & " " & DK_Date & Chuoi_DK_WST1 _
View attachment 250978
Muốn cho chắc mà không dùng thêm SubQuery thì bạn có thể giới hạn recordset nó nhé. Ví dụ code sau tôi Ví dụ là sẽ giới hạn lấy 10 dòng đầu, mặc kệ kết quả trả về nó là bao nhiêu.
Dữ liệu Sheet1
1608177135785.png

Sau khi chạy code sau:
Mã:
Sub SelectTop10_HLMT()
    With CreateObject("ADODB.Recordset")
        .Open "Select top 10 * from [Sheet1$] order by STT", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .DataSource
    End With
End Sub
Thì tôi được kết quả Sheet2
1608177322273.png
Kết quả trả về hơn 10 dòng. Vậy tôi sẽ giới hạn kết quả chỉ 10 dòng thì tôi thêm số 10 vào sau .DataSource
Rich (BB code):
Sub SelectTop10_HLMT()
    With CreateObject("ADODB.Recordset")
        .Open "Select top 10 * from [Sheet1$] order by STT", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName  
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 10
    End With
End Sub

Tôi chạy code trên và cho ra kết quả như hình bên dưới là 10 dòng dữ liệu như mong đợi mà không cần dùng SubQuery.

1608177559395.png
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom