PDA

View Full Version : SQL trong VB



Fetblackeyes
30-11-2004, 14:35
Tôi có một câu Query dạng như sau: SELECT F1, F2, F1*100/F2 as Rate FROM Table
Do giá trị của F2 trong Table có lúc bằng 0 nên kết quả Rate sẽ bị lỗi và sẽ gây lỗi khi đưa Query này vào DataControl để cho hiển thị lên DBGrid hoặc khi lấy giá trị của trường Rate . Làm thế nào để tôi có thể lấy hết được giá trị của F1 và F2 kể cả khi F2=0 (khi đó có thể cho Rate=0). Ai có kinh nghiệm về bẫy lỗi này xin chỉ giáo giùm.
Xin cảm ơn

buikiem
30-11-2004, 19:38
Mình thương làm như vầy.
SELECT F1, F2, F1*100/F2 as Rate FROM Table
WHERE F2<>0
SELECT F1, F2, F1 as Rate FROM Table WHERE F2=0
chạy cùng lúc 2 câu select trên
bạn thử coi có được không nhỉ.

Fetblackeyes
01-12-2004, 08:13
Cảm ơn bạn.
Tôi cũng đã thử cách này rồi, có điều dùng thêm UNION để nối 2 câu thành 1:
(SELECT F1, F2, F1*100/F2 as Rate FROM Table WHERE F2<>0) UNION (SELECT F1, F2, F1 as Rate FROM Table WHERE F2=0). Tuy nhiên khi gặp phải câu Query dài thì nó thành dài gấp đôi.

past_beggar
04-12-2004, 13:33
Cảm ơn bạn.
Tôi cũng đã thử cách này rồi, có điều dùng thêm UNION để nối 2 câu thành 1:
(SELECT F1, F2, F1*100/F2 as Rate FROM Table WHERE F2<>0) UNION (SELECT F1, F2, F1 as Rate FROM Table WHERE F2=0). Tuy nhiên khi gặp phải câu Query dài thì nó thành dài gấp đôi.

Bạn giải thích kỹ thêm??

PS: Yên tâm đi, cao thủ đi đòi công lý thì có thấp thủ tiếp chiêu đây

Fetblackeyes
04-12-2004, 14:32
Thứ nhất theo cách này thì cần hai câu Query, 1 cho trwờng hợp F2=0 và 1 cho trwờng hợp F2<>0 nối với nhau thì nó sẽ dài gấp đôi.
Thứ hai, nếu có thêm một biểu thức nữa trong câu này ví dụ như:
SQL=" SELECT F1, F2, F3 ,F1*100/F2 as F1_F2_Rate, F1*100/F3 as F1_F3_Rate FROM Table"
Trong trường hợp F2 và F3 đều có những record =0 thì sao?
Tôi đã dùng DataControl (Data) và một FlexGrid để thử:
FlexGrid.DataSource=Data
Data.DatabaseName = DBName
Data.RecordSource = SQL
Data.Refresh
Kết quả FlexGrid vẫn hiển thị bảng nhưng từ những Record có F2 hoặc F3 bằng 0 (khi có lỗi ở phép chia) thì không hiển thị, cũng không thông báo lỗi.
Mong các bạn chỉ giúp.
Xin cảm ơn!

buikiem
06-12-2004, 09:28
Mình nghĩ như vậy he. Nếu nó phức tap vậy tại sao bạn không tao ra một bảng Temp rồi dùng code vb để điền đầu đủ thông tin cho bảng temp này(hoàn toàn làm được tuy hơi mất công). Hoặc bạn có thể dùng view để tạo ra dữ liệu mình cần.bạn có thể dùng 3 câu select ma. sau dó chỉ việc load lên Gird thôi.

Fetblackeyes
06-12-2004, 14:00
Trường hợp của tôi sau khi tạo bảng (bằng SQL) thì các giá trị ở phép chia cho 0 lại là #Error (mở bằng Access) và không thể lấy được chúng.

Fetblackeyes
06-12-2004, 15:39
Tôi đã tìm được giải pháp rồi. SQL có hàm IIF như sau:
SELECT F1, F2, F3 ,IIF(F2=0,0,F1*100/F2) as F1_F2_Rate FROM Table
Cấu trúc hàm này có trong HELP của Access. Cảm ơn mọi người đã quan tâm

thangdung
06-12-2004, 20:05
neu dung SQL Server 2000 thi dung ham case when ... else ... end (xem phan help cua no co nhieu vd cho ban)

kazujo
06-12-2004, 21:44
uh , bạn thử dùng T-SQL xem , nó cũng có thể lập trình như bao ngôn ngữ khác ah

buikiem
07-12-2004, 16:38
wa rất hay! Mình phải cảm mơn bạn đó. Hình như ta còn có thể dùng nhiều hơn vậy nữa thì phải.Hay ghê