【问题标题】:Summing By Count按计数求和
【发布时间】:2014-12-23 23:28:20
【问题描述】:

我正在尝试根据特定列的计数来创建求和。如果您查看下面 Select 中的最后一行,您会发现我尝试实现 CASE 语句。但是,它会生成所有 NULL 值。我相信我理解为什么(每一行都有一组唯一的值),但我不确定如何解决我的问题。

SELECT 
    TotalFilesProduced.ReviewDate,
    TotalFilesProduced.FileReviewedByUserID,
    TotalFilesProduced.FileSource,
    TotalFilesProduced.FilesIndexed TotalIndexed,
    TotalFilesProduced.FileNumberofPages TotalFileNumberofPages,
    TotalFilesProduced.FilesProduced,
    CASE WHEN COUNT(DISTINCT FileReviewedByUserID) > 1 THEN SUM(TotalFilesProduced.FilesIndexed) END
FROM 
(SELECT 
    CAST(ibfp.FileReviewedDate AS DATE) ReviewDate,
    ibfp.FileReviewedByUserID,
    FileSource,
    COUNT(*) FilesProduced,
    COUNT(DISTINCT ibf.InboundFileID) FilesIndexed,
    SUM(CASE WHEN ibfp.FromPage = ibfp.ToPage THEN 1
    ELSE ibfp.ToPage-ibfp.FromPage + 1 END) [FileNumberofPages]
FROM 
    dbo.InboundFilePartitions ibfp
    INNER JOIN dbo.InboundFiles ibf ON ibfp.InboundFileID = ibf.InboundFileID
WHERE
        CAST(ibfp.FileReviewedDate AS DATE) >= '10/22/2014'
    and CAST(ibfp.FileReviewedDate AS DATE) <= '10/22/2014'
    and ibf.ProjectID in (110)
GROUP BY
    CAST(ibfp.FileReviewedDate AS DATE),
    ibfp.FileReviewedByUserID,
    FileSource 
) TotalFilesProduced
GROUP BY 
    TotalFilesProduced.ReviewDate,
    TotalFilesProduced.FileReviewedByUserID,
    TotalFilesProduced.FileSource,
    TotalFilesProduced.FilesIndexed,
    TotalFilesProduced.FileNumberofPages,
    TotalFilesProduced.FilesProduced

这是一个进一步说明的示例 - 这里产生 NULL 的 UserID 1036 很好,因为它只出现一次,但对于 804 - 我想对 TotalIndexed 列求和,因此 NULL 区域应为 139 (对于出现 804 的两种情况)

ReviewDate | FilereviewedByUserID | FileSource | TotalIndexed | TotalFileNumberofPages | FilesProduced | (No Column Name) /*My Sum*/
------------------------------------------------------------------------------------------------------------------------------------
2014-10-22 | 804                  | 1          | 1            | 67                     | 1             | NULL
------------------------------------------------------------------------------------------------------------------------------------
2014-10-22 | 1036                 | 1          | 1            | 17                     | 1             | NULL
------------------------------------------------------------------------------------------------------------------------------------
2014-10-22 | 804                  | 2          | 138          | 3322                   | 184           | NULL 

【问题讨论】:

  • 因为FileReviewedByUserIDFilesIndexed 在您的GROUP BY 语句中,所以这些总和永远不会超过一。您能澄清一下您要计算的内容吗?
  • FilereviewedByUserID - 如果用户出现多次(计数 - 我决定使用),则将其 TotalIndexed 列相加
  • 第三次了。计数组永远不会> 1。投票结束,因为不清楚您要做什么。
  • 我不知道如何更清楚地解释它 - 如果用户 ID 显示不止一次 - 我希望将上面显示的 TotalIndexed 列加在一起。我知道分组使其不确定 - 但如果没有分组,查询甚至不会运行 - 因为我在 CASE 中使用了计数和总和。
  • 不,你没有解释你想要什么。用清晰的语言在问题中解释你想要什么。使用 group by 来运行查询并不能解决任何问题。

标签: sql tsql count sum case


【解决方案1】:

如评论中所述
这将永远是错误的

CASE WHEN COUNT(DISTINCT FileReviewedByUserID) > 1 

因为

GROUP BY ibfp.FileReviewedByUserID 

你还有一些奇怪的东西

        CAST(ibfp.FileReviewedDate AS DATE) >= '10/22/2014'
    and CAST(ibfp.FileReviewedDate AS DATE) <= '10/22/2014'

一样
CAST(ibfp.FileReviewedDate AS DATE) = '10/22/2014'

更多奇怪的东西

SUM(CASE WHEN ibfp.FromPage = ibfp.ToPage THEN 1
    ELSE ibfp.ToPage-ibfp.FromPage + 1 END) [FileNumberofPages]

一样
SUM(ibfp.ToPage-ibfp.FromPage + 1) [FileNumberofPages] 

不确定您要做什么,但 group by 上的 group by 并不常见

【讨论】:

  • 这实际上是我简化了一个更大的查询。因此 From 中的 Group By 和另一个 Group By
  • 此外,它们通常是捕获的日期范围 - 而不仅仅是一天。此外,没想到要简化 Page 的事情 - 但现在我发现我可以:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多