单个行的问题计数项目

时间:2019-06-24 01:13:35

标签: tsql

我需要根据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

2 个答案:

答案 0 :(得分:0)

尝试您的数据时,我得到以下结果:

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

答案 1 :(得分:0)

这应该做到:

;WITH CTE AS 
(
    SELECT  A.DailyFieldRecordID
            ,ActivityID             = IIF(A.ActivityID = 0, NULL, A.ActivityID)
            ,AdittionalActivityID   = IIF(A.AdittionalActivityID = 0, NULL, A.AdittionalActivityID)
    FROM    AB953 A
    WHERE   A.GroupID = 260
    AND     A.ItemID IN (1302,1303,1305,1306)
)
SELECT  DailyFieldRecordID
        ,CNT = COUNT(DISTINCT ActivityID) + COUNT(DISTINCT AdittionalActivityID)
FROM    CTE
GROUP   BY DailyFieldRecordID;

我创建了此DDL和测试数据以进行测试:

DROP TABLE IF EXISTS AB953
GO

CREATE TABLE AB953 (
DailyFieldRecordID INT,  GroupID INT,  ItemID INT,  ActivityID INT, AdittionalActivityID INT)

INSERT INTO AB953
VALUES
 (    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    )
GO