2012-01-12 59 views
1

我正在使用SQL庫(編程庫,ANSI SQL兼容,稱爲ABS數據庫,(http://www.componentace.com/help/absdb_manual/absdbmanual_content.htm ),它支持多種連接,CASE等..SQL外部加入同一表中的多個總計列

我有一個表(聘任),這是約會的表。

ApptKey - Integer - Primary Key 
SA_ID - Integer (a person’s ID, think employee number), 
Layer - Integer – only 4 different values, 1, 2, 3 or 4 (think Appt Category) 
Number_Of_Minutes - Integer – the length of the appointment 

注意某些SA_ID /層的組合可能是空的(即沒有行的組合)其他SA_ID /圖層組合可能有多行(我沒有顯示其他列,因爲它們在這裏不相關)我需要一個報告來顯示mi對於每個人(SA_ID),對於每個層,在一行中都是nute ...即,每個SA_ID具有它們自己的行,顯示Layer = 1的總和,layer = 2的總和,Layer = 3的總和以及總和用於層= 4

實施例數據...

SA_ID   LAYER  Number_of_Minutes 
1    1   10 
1    1   30 
2    1   10 
3    2   10 
1    4   10 

我需要一個查詢,給出了這樣的結果。

SA_ID  LAYER_1  LAYER_2 LAYER_3  LAYER_4 
1   40   0   0   10 
2   10   0   0   0 
3   0   10   0   0 

我需要這種類型的格式,因爲此查詢饋送圖/圖表組件...

我想我需要使用正確的加入多個相關子查詢,但我不能讓它上班。這是正確的做法嗎?我在下面運行,但作爲直接連接。我可以(或者我怎麼)重寫這個來使用正確的外連接?是一個正確的外部加入最好的方法?

select g.sa_id, l1.totalsum, l2.totalsum, l3.totalsum, l4.totalsum 
from (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 1 group by sa_id, layer) l1, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 2 group by sa_id, layer) l2, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 3 group by sa_id, layer) l3, 
      (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 4 group by sa_id, layer) l4, 
      (select distinct sa_id "sa_id" from appt) g 
where 
     (l1.sa_id = g.sa_id) 
and (l2.sa_id = g.sa_id) 
and (l3.sa_id = g.sa_id) 
and (l4.sa_id = g.sa_id) 

回答

1
SELECT SA_ID, 
SUM(CASE WHEN LAYER = 1 THEN Number_of_Minutes ELSE 0 END) AS LAYER_1, 
SUM(CASE WHEN LAYER = 2 THEN Number_of_Minutes ELSE 0 END) AS LAYER_2, 
SUM(CASE WHEN LAYER = 3 THEN Number_of_Minutes ELSE 0 END) AS LAYER_3, 
SUM(CASE WHEN LAYER = 4 THEN Number_of_Minutes ELSE 0 END) AS LAYER_4 
FROM Appt 
GROUP BY SA_ID 

編輯:由於它支持CASE表達式。

+0

簡單,優雅,它的作品!比加入更簡單。謝謝! – user1009073 2012-01-12 13:30:14

0
SELECT 
    t.sa_id, 
    Layer1=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 1), 
    Layer2=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 2), 
    Layer3=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 3), 
    Layer4=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 4) 

FROM 
(
    SELECT DISTINCT 
     sa_id 
    FROM appt 
) t