首页 > 解决方案 > 单行项目计数问题

问题描述

我需要根据 GroupID = 260 和 ItemID 为 1302、1303、1305、1306 时的每个 DailyFieldRecordID 找到 ActivityID 和 AdditionalActivityID 的计数。我遇到的问题是,无论每个 DailyFieldRecordID 有多少行,无论有多少行符合约束,都只能有一个 ActivityID 和一个 AdditionalActivityID。假设某人正在填写表格,他们列出了他们当天的活动以及他们可能进行的其他活动。他们只能列出一项主要活动(ActivityID)和一项次要活动(AdditionalActivity)。但是在这些活动中,他们可以与多个组(GroupID)或人员(ItemID)一起参与。因此,当我运行此查询时,我能够根据约束分隔行,但我只想计算他们参加了多少活动,每个 DailyFieldRecordID 将是 1 或 2,无论涉及多少组或人员。现在,我的查询正在计算符合条件的每一行的每个 ActivityID 和 AdditionalActivityID,这可以为每个 DailyFieldRecordID 提供不止 1 或 2 个。我只是不确定我将如何去做。非常感谢任何反馈。

 DailyFieldRecordID:   GroupID:  ItemID:  ActivityID: AdittionalActivityID:
    3369320             260        1302      37                     0
    3369320             260        1305      37                     0
    3369320             210        2222      37                     0
    3369320             250        2222      37                     0
    3372806             260        1302      56                     56
    3372806             260        1305      56                     56
    3372806             250        2222      56                     56
    3388888             260        2222      45                     32

  Expected Result:
   DailyFieldRecordID:       Count:
        3369320                 1
        3372806                 2



 Current Result:
    DailyFieldRecordID:      Count:   
        3369320                2
        3372806                4

'

select a.DailyFieldRecordID,
        count(case when a.ActivityID <>0 then 1 else null end) +
        count(case when a.AdditionalActivityID <>0 then 1 else null end) as count
from AB953 a
where a.GroupID= 260 and exists(
        select b.DailyFieldRecordID
        from AB953 b
        where a.DailyFieldRecordID = b.DailyFieldRecordID and b.ItemID in (1302,1303,1305,1306))
group by DailyFieldRecordID

标签: tsql

解决方案


尝试您的数据时,我得到了这个结果:

DailyfieldrecordID   Count
3369320                3
3372806                2
3388888                1


 SELECT DailyFieldRecordID,
        COUNT(CASE WHEN ActivityID <>0 then 1 else 0 end  +
        CASE WHEN AdditionalActivityID <>0 then 1 else 0 end) as Count
from Foo
where GroupID= 260 and exists(
        select b.DailyFieldRecordID
        from fOO b
        where DailyFieldRecordID = b.DailyFieldRecordID and b.ItemID in (1302,1303,1305,1306))
group by DailyFieldRecordID

新查询:您可能需要摆弄这个,不确定您的数据是否错误......不能让它选择 3 然后选择 2:

SELECT DailyFieldRecordID,
        COUNT(CASE WHEN ActivityID <>0 then 1 else 0 end  +
        CASE WHEN AdditionalActivityID <>0 then 1 else 0 end) as Count
from Foo
where GroupID= 260 and DailyFieldRecordID IN(
        select b.DailyFieldRecordID
        from fOO b
        where b.ItemID IN(1302,1303,1305,1306))
group by DailyFieldRecordID

推荐阅读