0

集荷をカウントし、それをクライアントの民族性とカテゴリで分割するクエリがあります。それは機能しますが、クライアントテーブルのアクティブなクライアントの総数である1つの列を計算する必要があり'Pickups as % of Active'ます(アクティブなクライアントはクライアントテーブルの(1,2,6)のStatusIDであり、他のすべてのステータスは非アクティブとしてカウントされます)私のクエリは次のようになります

SELECT
max(a.AgencyName)as Agency,
COUNT(PickupID)as Pickups,
( COUNT(PickupID)/(select  COUNT( c.ClientID) AS ActiveClients 
    FROM Clients c
    WHERE c.StatusID in (1,2,6) 
    GROUP BY c.AgencyID)) as 'Pickups as % of Active',
--SUM(CASE WHEN c.StatusID in (1,2,6) THEN 1 ELSE 0 END)/ COUNT(PickupID) as 'Pickups as % of Active',
count (CASE WHEN p.CategCode = 'NB' THEN p.CategCode END) as NB
,count (CASE WHEN p.CategCode = 'IN' THEN p.CategCode END) as 'IN'
,count (CASE WHEN p.CategCode = 'CH' THEN p.CategCode END) as 'CH'
,count (CASE WHEN p.CategCode = 'PG' THEN p.CategCode END) as 'PG'
,count (CASE WHEN p.CategCode = 'BF' THEN p.CategCode END) as 'BF'
,count (CASE WHEN p.CategCode = 'PP' THEN p.CategCode END) as 'PP'
,count (CASE WHEN p.CategCode = 'SR' THEN p.CategCode END) as 'SR'

,count (CASE WHEN p.EthnCode = 'N' THEN p.EthnCode END) as Nat
,count (CASE WHEN p.EthnCode = 'A' THEN p.EthnCode END) as Asn
,count (CASE WHEN p.EthnCode = 'B' THEN p.EthnCode END) as Blk
,count (CASE WHEN p.EthnCode = 'P' THEN p.EthnCode END) as Pac
,count (CASE WHEN p.EthnCode = 'W' THEN p.EthnCode END) as Wth
,count (CASE WHEN p.EthnCode NOT IN ('N', 'A', 'B', 'P', 'W', '0') THEN p.EthnCode END) as Nat
,count (CASE WHEN p.EthnCode = '0' THEN p.EthnCode END) as Unknown
,count (CASE when PickupHispanic=1 then PickupHispanic end) as Hispanic 

FROM dbo.Pickup p join Agency a on p.agencyid = a.agencyid join Clients c ON c.ClientID = p.ClientID
where  PickupDate  between '2013-01-01' and '2013-01-31' 
group by a.AgencyID 

WITH ROLLUP
order by 1

エラーをスローします

Msg 512, Level 16, State 1, Line 5
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Warning: Null value is eliminated by an aggregate or other SET operation.
4

2 に答える 2

1

成功した場合は1を返し、そうでない場合は0を返す式にテストを追加します。次に、それを合計し、合計で割ってパーセンテージを取得します。

次のようなものを使用できます。

SUM(CASE WHEN c.StatusID in (1,2,6)
          and p.PickupDate  between '2012-01-01' and '2012-01-31' 
    THEN 1 
    ELSE 0
    END)
/ 
COUNT(PickupID)
as 'Pickups as % of Active'

編集:わかりました、私は最初に間違っていたことがわかります。代わりに、サブクエリとしてアクティブのカウントを取得できます。

SELECT
max(a.AgencyName)as Agency,
COUNT(PickupID)as Pickups,

COUNT(PickupID) / ActiveClients AS 'Pickups as % of Active',

count (CASE WHEN p.CategCode = 'NB' THEN p.CategCode END) as NB
,count (CASE WHEN p.CategCode = 'IN' THEN p.CategCode END) as 'IN'
,count (CASE WHEN p.CategCode = 'CH' THEN p.CategCode END) as 'CH'
,count (CASE WHEN p.CategCode = 'PG' THEN p.CategCode END) as 'PG'
,count (CASE WHEN p.CategCode = 'BF' THEN p.CategCode END) as 'BF'
,count (CASE WHEN p.CategCode = 'PP' THEN p.CategCode END) as 'PP'
,count (CASE WHEN p.CategCode = 'SR' THEN p.CategCode END) as 'SR'

,count (CASE WHEN p.EthnCode = 'N' THEN p.EthnCode END) as Nat
,count (CASE WHEN p.EthnCode = 'A' THEN p.EthnCode END) as Asn
,count (CASE WHEN p.EthnCode = 'B' THEN p.EthnCode END) as Blk
,count (CASE WHEN p.EthnCode = 'P' THEN p.EthnCode END) as Pac
,count (CASE WHEN p.EthnCode = 'W' THEN p.EthnCode END) as Wth
,count (CASE WHEN p.EthnCode NOT IN ('N', 'A', 'B', 'P', 'W', '0') THEN p.EthnCode END) as Nat
,count (CASE WHEN p.EthnCode = '0' THEN p.EthnCode END) as Unknown
,count (CASE when PickupHispanic=1 then PickupHispanic end) as Hispanic 

FROM dbo.Pickup p join Agency a on p.agencyid = a.agencyid 

join 
(select c.ClientID, COUNT( c.ClientID) AS ActiveClients 
    FROM dbo.Pickup p 
    JOIN Clients c on c.ClientID = p.ClientID
    WHERE 
        c.StatusID in (1,2,6) 
        and p.PickupDate  between '2012-01-01' and '2012-01-31' 
    GROUP BY c.ClientID
) ActiveClientCounts
ON p.ClientID = ActiveClientCounts.ClientID

where  PickupDate  between '2012-01-01' and '2012-01-31' 
group by a.AgencyID 

WITH ROLLUP
order by 1
于 2013-03-14T01:19:04.063 に答える
1

問題は、Countが整数になることです。そして、整数を整数で割ると、結果として整数になります。

分母を小数としてキャストしてみてください。出力として小数が表示されます。

 select 100 * COUNT(PickupID)/CAST(COUNT( c.ClientID) AS DECIMAL)

編集:

さて、あなたはコードを数回変更しましたが、これはかなり混乱しています。

現時点で私が見ることができることから、あなたのエラーはGroup By c.AgencyIDサブクエリの句から来ています。これはどう:

( COUNT(PickupID)/(select Cast(COUNT( c.ClientID) AS DECIMAL) AS ActiveClients 
    FROM Clients c
    WHERE c.StatusID in (1,2,6) 
    AND c.AgencyID = a.AgencyID )) as 'Pickups as % of Active',

編集2:

10進数の結果のキャスト、および2dpのキャスト:

CAST(( COUNT(PickupID)/(select CAST(COUNT( c.ClientID) AS DECIMAL) AS ActiveClients 
    FROM Clients c
    WHERE c.StatusID in (1,2,6) 
    AND c.AgencyID = a.AgencyID )) as Decimal(10,2)) as 'Pickups as % of Active',
于 2013-03-14T01:23:25.650 に答える