2016-03-24 8 views
1

:私は値= 0の行を非表示にするが、合計の計算に、その他の列の値をカウント - 私はそのようなテーブル有するSQL2008

WaitingData 
C1  C2  C3  Number 
A  B  1  10 
A  B  2  0 
A  B  3  4 
X  B  4  2 

CompletedData 
C1  C2  C3  Number 
A  B  1  5 
A  B  2  2 
A  B  3  0 
X  B  4  12 

(C1-C2のVARCHAR(10)、C3-番号int)をこれは以下のように私に出力を与えている

Select wd.C1,wd.C2,wd.C3,wd.Number as NW,cdd.Number as NC 
into #AllData 
from (Select C1,C2,C3,sum(Number) from WaitingData group by C1,C2,C3) wd 
outer apply (Select C1,C2,C3,sum(Number) 
      from CompletedData cd 
      where wd.C1=cd.C1 and wd.C2=cd.C2 and wd.C3=cd.C3 
      ) cdd 


Select * from #AllData 
union 
Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NW) 
from #AllData 

C1  C2  C3  NW  NC 
A  B  1  10  5 
A  B  2  0  2 
A  B  3  4  0 
X  B  4  2  12 
Total Total -1  16  19 

は、しかし、私は行THAを非表示にするデータを表現するには、以下のクエリを使用してtにはNWはありませんが、合計行を計算している間にその値に関する計算を行います(下記のNCを参照)。私が望む出力は次のようなものです:

C1  C2  C3  NW  NC 
A  B  1  10  5 
A  B  3  4  0 
X  B  4  2  12 
Total Total -1  16  19 

このような出力を得る方法が見つかりませんでした。どんな助けでも大歓迎です!

------------------------------ EDIT -------------- -------------------------

------------------- ----------- EDIT -------------------------------------- - 私は以下のようなテーブル内のデータを持っている場合は、私がしたいように

は、外側が動作していない適用し、それはデータが含まれていませんA B 2.

WaitingData 

C1  C2  C3  Number 
A  B  1  10 
A  B  3  4 
X  B  4  2 

CompletedData 
C1  C2  C3  Number 
A  B  1  5 
A  B  2  2 
X  B  4  12 

そして、出力は次のように次のようになります。このような状況で

C1  C2  C3  NW  NC 
A  B  1  10  5 
A  B  3  4  NULL 
X  B  4  2  12 
Total Total -1  16  17 

、私は最終的な結果にA B 2である「2」NC値をカウントし、によって含まれるすべてのレコードを挿入を除いて、19ではなく17とNCを見るために何ができますCompletedDataでもWaitingDataですか?両方のテーブルからすべての値を取得するためにfull joinの使用:ラップ1以上の選択およびNWは= 0

select * from 
(
Select * from #AllData 
union 
Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NC) 
from #AllData 
) t 
where NW <> 0 

編集行を除外すると、最終的な結果

答えて

2

を(効率的な方法が必要です)。

with t as 
(select coalesce(w.c1,c.c1) as c1,coalesce(w.c2,c.c2) as c2,coalesce(w.c3,c.c3) as c3 
, coalesce(w.number,0) as nw , coalesce(c.number,0) as nc 
from waitingdata w 
full join completeddata c on w.c1 = c.c1 and w.c2=c.c2 and w.c3=c.c3) 
select * from 
(select * from t 
union all 
Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NC) 
from t) x where nw <> 0 
+0

私はカントは、私がこれを参照してくださいcouldntのと信じています。私は黒いコーヒーが必要なようだ。ありがとう:) –

+0

私は質問を編集し、もう一つ質問しました。あなたはそれについても考えていますか? @vkp –

+0

私は両方のテーブルからすべての値を取得する '完全な結合 'を使用する必要がありますと信じています。 –

0

あなたがROLLUP演算子を使用して一時テーブル、中間結果、サブクエリ、またはUNIONなし、1つのクエリでこのすべてを行うことができます。

SELECT 
    WD.C1, 
    WD.C2, 
    WD.C3, 
    SUM(WD.Number) AS NW, 
    SUM(CD.Number) AS NC 
FROM 
    dbo.WaitingData WD 
LEFT OUTER JOIN CompletedData CD ON 
    CD.C1 = WD.C1 AND 
    CD.C2 = WD.C2 AND 
    CD.C3 = WD.C3 
GROUP BY 
    WD.C1, 
    WD.C2, 
    WD.C3 
WITH ROLLUP 
HAVING 
    GROUPING_ID(WD.C1, WD.C2, WD.C3) IN (0, 7) AND 
    SUM(WD.Number) <> 0 
関連する問題