線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1130
推到 Plurk!
推到 Facebook!

資料JOIN連結問題

答題得分者是:jackiemi2_seed
tee101984
一般會員


發表:3
回覆:2
積分:1
註冊:2009-06-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-29 20:37:59 IP:59.105.xxx.xxx 訂閱
請教各位前輩,目前我遇到一個問題是我要計算應完成的事件總數以及已完成總數,並且將完成度用百分比顯現,但因為資料是透過多層連結才知道詳細情況,雖然下面的程式碼可以顯現出來我要的結果,但是如果BBB的全部資料裡的Sheets.Status都沒有已完成的(3是完成的代碼),會變成沒有資料顯現出來....有前輩可以指點一下迷津嗎?
[code sql]
select AAA.sname,CT,CT2,convert(varchar, CT2 / convert(float,CT)*100) '%' as completion
from

(SELECT dbo.SS.sname, count(*) as CT
FROM dbo.SS INNER JOIN
dbo.P_S ON
dbo.SS.S_No = dbo.P_S.S_No INNER JOIN
dbo.Stu ON dbo.SS.S_No = dbo.Stu.S_No INNER JOIN
dbo.Sheets ON dbo.Stu.Stu_No = dbo.Sheets.Stu_No INNER JOIN
dbo.[Plan] ON dbo.P_S.P_No = dbo.[Plan].P_No
where dbo.[Plan].P_No = 'P1'
group by dbo.SS.sname) AAA join

(SELECT dbo.SS.sname, count(*) as CT2
FROM dbo.SS INNER JOIN
dbo.P_S ON
dbo.SS.S_No = dbo.P_S.S_No INNER JOIN
dbo.Stu ON dbo.SS.S_No = dbo.Stu.S_No INNER JOIN
dbo.Sheets ON dbo.Stu.Stu_No = dbo.Sheets.Stu_No INNER JOIN
dbo.[Plan] ON dbo.P_S.P_No = dbo.[Plan].P_No
where dbo.[Plan].P_No = 'P1' and dbo.Sheets.Status = 3
group by dbo.SS.sname) BBB

on AAA.sname = BBB.sname

[/code]
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-03 10:38:23 IP:61.218.xxx.xxx 訂閱
方法1:
select
AAA.sname,CT,CT2,convert(varchar, CT2 / convert(float,CT)*100) '%' as completion
CT2的部份改成isnull(CT2,0)

on
AAA.sname = BBB.sname 改成left join, on AAA.sname *= BBB.sname
方法2:
這語法在ms sql 2000可行
SELECT dbo.SS.sname, count(*) as CT ,count(case when dbo.Sheets.Status = 3 then 1 else 0 end) as CT2
FROM dbo.SS INNER JOIN
dbo.P_S ON
dbo.SS.S_No = dbo.P_S.S_No INNER JOIN
dbo.Stu ON dbo.SS.S_No = dbo.Stu.S_No INNER JOIN
dbo.Sheets ON dbo.Stu.Stu_No = dbo.Sheets.Stu_No INNER JOIN
dbo.[Plan] ON dbo.P_S.P_No = dbo.[Plan].P_No
where dbo.[Plan].P_No = 'P1'
group by dbo.SS.sname

------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
編輯記錄
jackiemi2_seed 重新編輯於 2009-07-03 10:48:42, 註解 無‧
tee101984
一般會員


發表:3
回覆:2
積分:1
註冊:2009-06-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-03 16:45:21 IP:59.105.xxx.xxx 訂閱

===================引 用 jackiemi2_seed 文 章===================
方法1:
select
AAA.sname,CT,CT2,convert(varchar, CT2 / convert(float,CT)*100) '%' as completion
CT2的部份改成isnull(CT2,0)

on
AAA.sname = BBB.sname 改成left join, on AAA.sname *= BBB.sname
方法2:
這語法在ms sql 2000可行
SELECT dbo.SS.sname, count(*) as CT ,count(case when dbo.Sheets.Status = 3 then 1 else 0 end) as CT2
FROM dbo.SS INNER JOIN
dbo.P_S ON
dbo.SS.S_No = dbo.P_S.S_No INNER JOIN
dbo.Stu ON dbo.SS.S_No = dbo.Stu.S_No INNER JOIN
dbo.Sheets ON dbo.Stu.Stu_No = dbo.Sheets.Stu_No INNER JOIN
dbo.[Plan] ON dbo.P_S.P_No = dbo.[Plan].P_No
where dbo.[Plan].P_No = 'P1'
group by dbo.SS.sname

方法1會出現on附近語法不正確
方法2可以執行,但是CT2的值跟CT的值一樣,並不會隨著dbo.Sheets.Status 的值更變。
請問是怎麼回事呢?
tee101984
一般會員


發表:3
回覆:2
積分:1
註冊:2009-06-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-03 20:01:08 IP:59.105.xxx.xxx 訂閱
我試出來了 改成SUM(case when dbo.Sheets.Status = 3 then 1 else 0 end) as CT2
就可以弄出我要的結果了
謝謝前輩給我的頭緒

系統時間:2024-05-14 6:27:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!