0

テーブル a とテーブル b の 2 つのテーブルがあります。

テーブルaは次のように設定されています...

ユーザー

Id  ...  InspectStat    PurchaseStat    SoldStat    POSStat
------------------------------------------------------------
 1        
 2
 3

プロパティ

UserId  ...  Stage  
---------------------------------------------------    
    1        Inspect 
    3        Purchase
    1        Sold
    2        POS

毎時間、各ステージの各ユーザーの合計プロパティの割合を計算するジョブを作成しようとしています。たとえば、最終結果は次のようになります (これらのプロパティが 4 つしかない場合)

Id  ...  InspectStat    PurchaseStat    SoldStat    POSStat
------------------------------------------------------------
 1           .5               0             .5         0
 2            0               0              0         1.0
 3            0               1.0            0         0

私が試してみました

ALTER PROCEDURE [dbo].[StatCounter]

AS
DECLARE @PropertyCount as float 

BEGIN

set @PropertyCount = (select count(AcquisitionAssociateId) from [dbo].[Properties],     [dbo].[Users]
WHERE
    [dbo].[Users].Id = [dbo].[Properties].AcquisitionAssociateId) 
update [dbo].[Users]
set [dbo].[Users].PurchaseStat = ((select count (AcquisitionAssociateId) from [dbo].[Properties]
WHERE 
    [dbo].[Users].Id = [dbo].[Properties].AcquisitionAssociateId 
    and 
    [dbo].[Properties].Stage = 'Purchase') / @PropertyCount)

...Repeat for 3 other stages

このメソッドは各ステージのプロパティの数を正しくカウントしていますが、実行した後、実際に行っているのは、ユーザーが割り当てられたプロパティの数をカウントしていて、プロパティの数を個別にカウントしていないことに気付きました個々のユーザーが実際に持っています。私は行くにつれてSQLを学んでいるので、助けていただければ幸いです。

4

1 に答える 1

1

これはピボットの特殊なケースです。以下は、 を使用して計算を行いavg()ます。統計に「1」の値を割り当て、平均は行の合計で除算します。

select userid,
       avg(case when Stage = 'Inspect' then 1.0 else 0.0 end) as InspectStat,
       avg(case when Stage = 'Purchase' then 1.0 else 0.0 end) as PurchaseStat,
       avg(case when Stage = 'Sold' then 1.0 else 0.0 end) as SoldStat,
       avg(case when Stage = 'POS' then 1.0 else 0.0 end) as POSStat
from properties p
group by userid
于 2013-04-25T15:30:29.173 に答える