2016-09-02 18 views
1

私はこのテーブルグループの二つの条件

SELECT 
     [WeldStatus] 
     ,PackageId 

    FROM [SPMS2].[dbo].[JointHistory] 

enter image description here

どのように私はこのクエリによってグループtotal testpackagetotal accepttotal remainを計算することができますがありますか?

例えば= 6030のPackageIDのために、私は、この必要があります。

packageid total accept remain 
6030  4  3  1 

答えて

1

使用CASEGroup By

SELECT 
     PackageId, 
     count(*) as total, 
     sum(case [WeldStatus] when 'Accept' then 1 end) as accept, 
     sum(case [WeldStatus] when 'accept' then 0 else 1 end) as remain 
    FROM [SPMS2].[dbo].[JointHistory] 
group by PackageId; 
1
SELECT 
packageid 
,count(*) as 'total' 
,sum(case when weldstatus = 'Accept' then 1 else 0 end) as 'accept' 
,sum(case when weldstatus is null then 1 else 0 end) as 'remain' 
FROM [SPMS2].[dbo].[JointHistory] 
group by packageid 

私に何度も救った "...合計(ケース" NULLは痛みになることもありますが、あなたを救うときには役に立ちます。

1

CASE式を集約して、目的の出力を実現します。 WeldStatusだけ'Accept'またはNULLの値を取る

SELECT 
    PackageId, 
    SUM (CASE WHEN WeldStatus = 'Accept' THEN 1 ELSE 0 END) AS AcceptCount, 
    SUM (CASE WHEN WeldStatus IS NULL THEN 1 ELSE 0 END) AS RemainCount, 
    COUNT (*) AS Total 
FROM [SPMS2].[dbo].[JointHistory] 
GROUP BY PackageId 
1
select packageid, SUM(TOTAL), SUM(ACCEPT), SUM(REMAIN) from (
select packageid, 1 as TOTAL, 
case 
when WeldStatus='Accept' then 1 else 0 
END as ACCEPT, 
case 
when WeldStatus IS NULL then 1 else 0 
END as REMAIN 
from JointHistory 
) group by packageid 
+0

'WeldStatus = '残存'はサンプルデータにはない、ちょうどヌル – vercelli

+1

ええ、有効なポイント –

1

場合は、簡単な方法は次のとおりです。

SELECT PackageId, count(*) as total, 
     count(WeldStatus) as accept, 
     count(*) - count(WeldStatus) as remain 
FROM [SPMS2].[dbo].[JointHistory] jh 
GROUP BY PackageId; 

私はこれが持つことの仮定に依存していることを是認する最初のよ単一の値またはNULL

0

SELECTのPackageID、 COUNT(*)の総AS、 SUM([WeldStatus] = THEN 1 END 'を受け入れる' CASE)AS受け入れる、 SUM(CASE WHEN ISNULL([WeldStatus]、 '')= ' 'THEN 1 ELSE 0 END)AS残る FROM [SPMS2]。[dbo]。[JointHistory] ​​ グループby PackageId;

関連する問題