TSQL仅分配给COUNT()行的子集

时间:2016-08-12 19:42:32

标签: sql-server tsql count

我有一个查询,我正在处理,对于销售表中的每个给定月份和年份,返回订购总项目的SUM()以及订购项目的不同帐户数量和一对夫妇在各种产品类型上分解了SUm()。请参阅下面的查询以获取示例:

SELECT      
    YearReported, 
    MonthReported,
    COUNT(DISTINCT DiamondId) as Accounts,
    SUM(Quantity) as TotalUnitsOrdered,
    SUM(CASE P.ProductType WHEN 1 THEN Quantity ELSE 0 END) as MonthliesOrdered,
    SUM(CASE P.ProductType WHEN 1 THEN 0 ELSE Quantity END) as TPBOrdered
FROM       
    RetailOrders R WITH (NOLOCK)
LEFT JOIN  
    Products P WITH (NOLOCK) ON R.ProductId = P.ProductId
GROUP BY   
    YearReported, MonthReported

我现在面临的问题是,我还需要根据数据集中的另一个字段来计算不同帐户的数量。例如:

SELECT      
    YearReported,
    MonthReported,
    COUNT(DISTINCT DiamondId) as Accounts, 
    SUM(Quantity) as TotalUnitsOrdered,
    SUM(CASE P.ProductType WHEN 1 THEN Quantity ELSE 0 END) as MonthliesOrdered,
    SUM(CASE P.ProductType WHEN 1 THEN 0 ELSE Quantity END) as TPBOrdered,
    SUM(CASE IsInitial WHEN 1 THEN Quantity ELSE 0 END) as InitialOrders,
    SUM(CASE IsInitial WHEN 0 THEN Quantity ELSE 0 END) as Reorders,
    COUNT(/*DISTINCT DiamndId WHERE IsInitial = 1 */) as InitialOrderAccounts 
FROM
    RetailOrders R WITH (NOLOCK)
LEFT JOIN  
    Products P WITH (NOLOCK) ON R.ProductId = P.ProductId
GROUP BY   
    YearReported, MonthReported

显然,我们会将最后一个SUM中的注释部分替换为不会引发错误的部分。我刚才补充说明了这一点。

我觉得这可以使用SQL中的分区方法来完成,但我必须承认我对它们不是很好,并且无法弄清楚如何做到这一点。昨晚在阅读它之后,分享在线的MS文档真的让我头疼。

编辑:我错误地将最后一个聚合函数作为总和,我的意思是它是一个COUNT()。

为了帮助澄清,COUNT(DISTINCT DiamondId)将返回集合中所有唯一DiamondId值的计数,但我还需要获取集合中所有Unique Diamond Id值的COUNT(),其中对应的IsInitial标志设置为1

1 个答案:

答案 0 :(得分:1)

只是将那些没有资格的人归零:

count(distinct
    case
        when IsInitial = 1 then DiamndId
        /* else null */
    end
)