0

我有两个表,表 a 和表 b。

表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 回答