2012-01-12 20 views
1

私はSQLライブラリ(プログラミングライブラリ、ANSI SQL準拠、ABSデータベースと呼ばれています(http://www.componentace.com/help/absdb_manual/absdbmanual_content.htm)を使用しています。いくつかのSA_ID /レイヤーの組み合わせがあり得ること)。それは私が予定のテーブルである単一のテーブル(APPT)を、持っている同じテーブルの複数の合計列のSQL外部結合

...様々参加し、CASEなどをサポートしています。

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 /レイヤの組み合わせは複数の行を持つことがあります(ここでは他の列は表示されません)。miの合計を表示するレポートが必要ですすなわち、各人物(SA_ID)は、各層について、1つの行に...すなわち、各SA_IDは、自身の行を有し、層= 1、層2の合計、層= 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 

EDIT:それはCASE表現をサポートしているため。

+0

シンプルで上品で動作します!結合よりもはるかに簡単です。ありがとう! – user1009073

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 
関連する問題