Xin trợ giúp Câu lệnh SQL xuất dữ liệu

Liên hệ QC

nguyenhai

Thành viên mới
Tham gia
24/6/07
Bài viết
15
Được thích
1
Xin chào các bạn, nhờ các bạn hướng dẫn giúp việc này: giả sử tôi một bảng có tên là H_Diemdo như sau:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600110 11/4/2005
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/3/2005
2 Nguyen Van B 140600112 12/6/2009
Nay tôi muốn trích dữ liệu bằng câu lệnh SQL ra một bảng T_ketqua có đủ các thông tin trên, với điều kiện ngày hiệu lực là gần nhất:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/6/2009
Mong các bạn giúp đỡ, rất cảm ơn và xin chúc các bạn luôn khỏe!



cleardot.gif
 
Lần chỉnh sửa cuối:
Xin chào các bạn, nhờ các bạn hướng dẫn giúp việc này: giả sử tôi một bảng có tên là H_Diemdo như sau:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600110 11/4/2005
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/3/2005
2 Nguyen Van B 140600112 12/6/2009
Nay tôi muốn trích dữ liệu bằng câu lệnh SQL ra một bảng T_ketqua có đủ các thông tin trên, với điều kiện ngày hiệu lực là gần nhất:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/6/2009
Mong các bạn giúp đỡ, rất cảm ơn và xin chúc các bạn luôn khỏe!

cleardot.gif

Tôi nghĩ bạn tham khảo trang sau:

http://www.access-programmers.co.uk/forums/archive/index.php/t-128191.html

Hy vọng sẽ giúp được bạn
 
PHP:
Select Ma_KH, Ten_KH, Max(Ngay_hieu_luc) As MaxHieuluc
From H_Diemdo
Group By Ma_KH, Ten_KH;
 
Lần chỉnh sửa cuối:
Nếu trong Access thì có thể dùng như sau:
Mã:
[COLOR=#000000][COLOR=#0000BB]Select TOP 1 [/COLOR][COLOR=#0000BB]*[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB]
From H_Diemdo 
Order By [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB]Ngay_hieu_luc[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] DESC
[/COLOR][/COLOR]
Nếu là trong SQL thì có thể dùng như sau
Mã:
[COLOR=#000000][COLOR=#0000BB]Select TOP 1 with ties *[/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB]
From H_Diemdo 
Order By [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB]Ngay_hieu_luc[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] DESC
[/COLOR][/COLOR]
 
Cách của RollOver chỉ lấy được duy nhất 1 record với ngày hiệu lực gần nhất. Yêu cầu là lấy mỗi mã KH 1 record.
Dữ liệu mẫu có Mã trạm khác nhau cho mỗi Mã KH nên lấy Max cũng chưa phải là đúng. Trừ khi loại trường Ma_Tram ra khỏi Query
 
Lần chỉnh sửa cuối:
Cách của RollOver chỉ lấy được duy nhất 1 record với ngày hiệu lực gần nhất. Yêu cầu là lấy mỗi mã KH 1 record.
Dữ liệu mẫu có Mã trạm khác nhau cho mỗi Mã KH nên lấy Max cũng chưa phải là đúng. Trừ khi loại trường Ma_Tram ra khỏi Query
Không phải là lấy duy nhất 1 record mà lấy toàn bộ các record có Ngày hiệu lực gần nhất đấy chứ. Còn lấy theo từng Mã trạm thì do tôi không thấy tác giả nói đến, nếu cần lấy theo từng Mã trạm thì dùng câu này
Với Access
Mã:
SELECT * 
FROM H_DIEMDO T1
WHERE Ngay_Hieu_Luc & Ma_Tram IN(
  SELECT TOP 1 Ngay_Hieu_Luc & Ma_Tram
  FROM H_DIEMDO T2
  WHERE T2.Ma_Tram=T1.Ma_Tram
  ORDER BY Ngay_Hieu_Luc DESC
)
Với SQL thì thay Ngay_Hieu_Luc & Ma_Tram thành Convert(char(8),Ngay_Hieu_Luc,112)+Ma_Tram
 
Phiền RollOver làm dùm 1 file access mẫu. Tôi thử cả 2 cách đều chỉ ra được 1 record duy nhất, tôi nghĩ là do câu "Top 1".

Nếu bỏ ma_Tram ra thì câu dưới đây lấy được 2 record cho 2 mã KH:

PHP:
Select Ma_KH, Ten_KH, Max(Ngay_hieu_luc) As MaxHieuluc
From H_Diemdo
Group By Ma_KH, Ten_KH;

Nếu có cả Ma_Tram thì lấy ra 3 record, vì mã KH 2 có 2 record với mã trạm giống nhau. Trong khi Mã KH 1 có 2 record thì có 2 mã trạm.
 
Phiền RollOver làm dùm 1 file access mẫu. Tôi thử cả 2 cách đều chỉ ra được 1 record duy nhất, tôi nghĩ là do câu "Top 1".

Nếu bỏ ma_Tram ra thì câu dưới đây lấy được 2 record cho 2 mã KH:

PHP:
Select Ma_KH, Ten_KH, Max(Ngay_hieu_luc) As MaxHieuluc
From H_Diemdo
Group By Ma_KH, Ten_KH;
Nếu có cả Ma_Tram thì lấy ra 3 record, vì mã KH 2 có 2 record với mã trạm giống nhau. Trong khi Mã KH 1 có 2 record thì có 2 mã trạm.
Đây là file tôi đã làm dữ liệu giống với tác giả, có thêm 1 record nữa cho tổng quát
- Query1 lấy ra dữ liệu có Ngày hiệu lực lớn nhất
- Query2 lấy ra dữ liệu có Ngày hiệu lực lớn nhất theo mỗi Mã khách hàng
- Query3 lấy ra dữ liệu có Ngày hiệu lực lớn nhất theo mỗi Mã trạm
Với dữ liệu kết quả như bài #1 của tác giả thì hình như lấy theo mỗi Mã khác hàng chứ không phải Mã trạm
- Cái hay chính là TOP 1 đấy, nếu ptm test mà chỉ ra 1 record duy nhất thì cần xem lại xem test trên Access hay SQL, trên SQL thì phải thêm WITH TIES như bài số #4 tôi đã làm cho cả 2 trường hợp.
 

File đính kèm

  • db1.rar
    10.2 KB · Đọc: 185
Lần chỉnh sửa cuối:
Qyery2 đúng ý tác giả hơn. Thanks Rollover.

Riêng Query 1 cũng y như tôi đã test, nếu 1 record RollOver thêm vào không trùng ngày với ngày lớn nhất thì chỉ lên có duy nhất 1 record như tôi đã test.

Còn kết quả như Query2 tôi cũng nghĩ tới, đó là dùng 1 query trung gian, nhưng chưa làm. Cách làm gộp thế này tôi chưa quen lắm.
 
Qyery2 đúng ý tác giả hơn. Thanks Rollover.

Riêng Query 1 cũng y như tôi đã test, nếu 1 record RollOver thêm vào không trùng ngày với ngày lớn nhất thì chỉ lên có duy nhất 1 record như tôi đã test.

Còn kết quả như Query2 tôi cũng nghĩ tới, đó là dùng 1 query trung gian, nhưng chưa làm. Cách làm gộp thế này tôi chưa quen lắm.
Query1 là do tôi thấy tác giả nói là của Ngày hiệu lực gần nhất mà không thấy đề cập gì thêm. Nhưng cái TOP n của access nếu có nhiều giá trị trùng nhau thì nó sẽ lấy ra hết, cái này khác với trong SQL, trong SQL thì nó chỉ lấy chính xác n record đầu tiên, nếu muốn lấy như access thì thêm WITH TIES. TOP n trong nhiều trường hợp dùng để khử các hàm thống kê và sub query vì hàm thống kê và sub query thường có tốc độ xử lý rất chậm.
 
Để tham khảo SQL cho Access các bạn có thể tham khảo sách tại đây.

SQL the complete reference 3rd edition tại đây.

LVD
 
Các bác cho em một câu SQL về tình hưống sau:
Em có một CSDL Oracle có tên là: hop, User: htt, pass: htt
Một bảng tên dop
ngay ten tuoi tien
20100101 Nguyen V An 44 120.000
20100105 Nguyen H Hoa 34 130.000
20100109 Nguyen V An 44 220.000

Em đã dùng đoạn code sau để kết nối thành công! Nhưng câu SELECT thì chưa ổn vì em muốn gộp Nguyen V An lại bằng Group by thì nó báo lỗi, khi bỏ ra thì chạy bình thường!

Dim OraSession As Object
Dim OraDatabase As Object
Dim EmpDynaset As Object
p = 20100305
Dim flds() As Object
Dim fldcount As Integer

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase("kt308", "app/app", 0&)
Set EmpDynaset = OraDatabase.CreateDynaset("select ngay,ten, tuoi, sum(tien) as tien from dop where ngay>20100100 group by ten", 0&)
 
Rất cảm ơn các bạn đã reply, nhựng tôi muốn trình bày rõ hơn:
Dữ liệu của tôi trên Oracle, tôi dùng Toad để trích.
Ý tôi muốn là xuất ra danh sách khách hàng theo mã khách hàng có mã trạm đúng là mã trạm được cập nhật ở ngày hiệu lực gần nhất, tức là có mã trạm mới nhất theo ngày hiệu lực của KH đó.
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600110 11/4/2005
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/3/2005
2 Nguyen Van B 140600112 12/6/2009
Nay tôi muốn trích dữ liệu bằng câu lệnh SQL ra một bảng T_ketqua có đủ các thông tin trên, với điều kiện ngày hiệu lực là gần nhất (VD đối vơ khách hàng A là mã trạm 1406000111)
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/6/2009
 
Bạn thử câu SQL sau:
Mã:
SELECT KH.Ma_KH, KH.Ma_tram, KH.Ten_KH, LAST(KH.Ngay_hieu_luc) AS [Ngay_hieu_luc]
FROM KH
GROUP BY KH.Ma_KH, KH.Ma_tram, KH.Ten_KH;

Lê Văn Duyệt
 
Web KT
Back
Top Bottom