我有一個棘手的情況,試圖從多個查詢中獲取信息到單個行中。如何將兩個查詢(union all)合併爲一行?
考慮下表:
CpuUage:
Time time
Group char(10)
Subsys char(4)
Jobs int
Cpu int
持以下資料:右側
Time Group Subsys Jobs Cpu
----- ------ ------ ---- ---
00:00 group1 NORM 1 101 (grp1-norm) A1
01:00 group1 SYS7 3 102 (grp1-sys7) A2
01:00 group1 NORM 5 104 (grp1-norm) A1
02:00 group1 NORM 7 108 (grp1-norm) A1
02:00 group2 NORM 9 116 (grp2-norm) B1
02:00 group3 SYS7 11 132 (grp3-sys7) C2
03:00 group1 SYS7 13 164 (grp1-sys7) A2
03:00 group1 IGNR 99 228 (grp1-ignr) --
的標誌物(如A1
)在報告中的章節下面每一行應該影響。
我需要一個查詢,可以爲每個用戶組返回一行,但只有一個附帶條件。 Jobs
和Cpu
的值必須根據子系統ID進入不同列,我只對SYS7
和NORM
子系統ID感興趣。
因此,舉例來說,我們需要滿足以下條件(在A/B/1/2
位交叉引用回到開頭的那個行):
<------ 1 ------> <------ 2 ------>
Group NormJobs NormCpu Sys7Jobs Sys7Cpu
------ -------- ------- -------- -------
A: group1 13 313 16 266
B: group2 9 116 0 0
C: group3 0 0 11 164
我們的舊報表解決方案可以運行多個查詢(用union all
)然後後期處理的行結合那些具有相同的組名,使:
Group NormJobs NormCpu Sys7Jobs Sys7Cpu
------ -------- ------- -------- -------
group1 13 313 0 0
group1 0 0 16 266
合併在一起,沿着線:
select groupname, sum(jobs), sum(cpu), 0, 0 from tbl
where subsys = 'NORM'
group by groupname
union all
select groupname, 0, 0, sum(jobs), sum(cpu) from tbl
where subsys = 'SYS7'
group by groupname
不幸的是,我們的新解決方案不允許後處理,而且這一切都必須在SQL查詢中完成。
請記住,可能有SYS7
行的行,NORM
行,兩者或兩者都不是,實現此目標的最佳方法是什麼?
我想過從外部選擇子表中查詢子表,但這可能會有性能方面的影響。
此外,這將是一個痛苦,因爲我不得不使外部查詢包括規範和SYS7子系統然後運行一個子查詢每場(我不能讓外部查詢只是NORM
工作,因爲只有SYS7
行的組的存在不會被這種方式捕獲)。
你可以編織任何你的左中 - 內越位加入魔法來提出一個可行的解決方案嗎?
我更喜歡與供應商無關的解決方案,但如果您必須轉到供應商特定的平臺,那麼該平臺就是DB2。儘管如此,其他平臺至少可以給我一些想法,讓我很高興看到它們。
如果你測試和比較的解決方案,我很想看看結果。本能地,我期望任何解決方案以某種方式執行CASE聲明的任務。即「如果groupname = g且subsys = s,則添加到聚合(g,s)」。我期望在數據檢索方面有更多的不同。但是,我很樂意看到DBMS可以利用索引信息來減少彙總某些組所需的比較次數。我建議你在你的物理排序順序(聚簇索引)是(subsys,groupname)的測試排列中加入。 – 2010-01-05 17:25:30