计算特定条件下的出现次数

Count number of occurrences with specific conditions

从下面的数据集中,我需要知道

How many providers have a positive response in Number 4 and Number 5.The positive response for Number 4 and Number 5 need to have occurred on the same Sheet. For example the below scenario would qualify for this condition (has to be in the same Offer):

SELECT 'CFC _EEU' AS PROVIDER, 'Offer 1' AS SHEET,  4 AS NUMBER, 'yes' AS RESPONSE
UNION
SELECT 'CFC _EEU' AS PROVIDER, 'Offer 1' AS SHEET,  5 AS NUMBER, 'yes' AS RESPONSE  

下面是数据集,然后是我试过的:

SELECT  'CFB_CSS'    AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   5   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFE _TSS'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE 



SELECT [PROVIDER],[SHEET],[Number],[RESPONSE]  
FROM (SELECT t.*,
             (row_number() over (order by [PROVIDER]) -
              row_number() over (partition by [SHEET]order by [PROVIDER])
             ) as grp
              from Test t
             --WHERE  ([Number] =4 AND [Response] ='yes') and 
    --               ([Number] =5 AND [Response] ='yes')
     ) t
group by grp, [PROVIDER],[SHEET],[Number],[RESPONSE] ;

我不知道如何实现我的条件:

WHERE  ([Number] = 4 AND [Response] = 'yes') and 
       ([Number] = 5 AND [Response] = 'yes')

一个选项使用 exists:

select count(distinct provider)
from mytable t
where t.number = 4 and t.response = 'yes' and exists (
    select 1
    from mytable t1
    where t1.provider = t.provider and t1.sheet = t.sheet and t1.number = 5 and t1.response = 'yes'
)

这计算了至少有一个 sheet 有两个数字并且对每个数字都有积极响应的提供者。

另一种方法是两级聚合:

select count(distinct provider)
from (
    select provider
    from mytable t
    where number in (4, 5) and response = 'yes'
    group by provider, sheet
    having min(number) <> max(number)
) t

请运行查询并查看结果。在我看来,这些是您正在寻找的结果:

SELECT * into #tmp FROM (
SELECT 'CFB_CSS' AS PROVIDER, 'Offer 1' AS SHEET, 4 AS NUMBER, 'no' AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 1'   AS SHEET,   5   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFC _EEU'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   5   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 2'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 3'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFE _TSS'   AS PROVIDER,   'Offer 1'   AS SHEET,   4   AS NUMBER,  'no'    AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 4'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 5'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 6'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 7'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 8'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE     UNION
SELECT  'CFD _PLL'   AS PROVIDER,   'Offer 9'   AS SHEET,   4   AS NUMBER,  'yes'   AS RESPONSE) as tmp

select *
into #tmp2
from (
    select * from #tmp
    where RESPONSE = 'yes'
    ) t
PIVOT(
    COUNT(response)
    FOR NUMBER IN (
        [Num4],
        [Num5])
) AS pivot_table;

select * from #tmp2

如果这些是您要查找的结果,那么以下查询将为您提供最终结果:

select *
from #tmp2
where Num4 > 0 and Num5 > 0