首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SUM by并非GROUP BY的所有字段

问SUM by并非GROUP BY的所有字段
EN

Stack Overflow用户
提问于 2018-01-10 23:09:03
回答 2查看 84关注 0票数 0

我有桌子:

代码语言:javascript
复制
Id(int), 
CompanyId(uniqueidentifier), 
DateCreated(datetime), 
TypeId(int), 
Value(int), 
Date(date)

和查询:

代码语言:javascript
复制
SELECT 
    W2CliendId,
    CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date) AS MonthStarts,
    CASE 
      WHEN TypeId = 1 THEN '4 Search views'
      WHEN TypeId = 2 THEN '5 Maps views'
      WHEN TypeId = 0 THEN 'Unknown'
    END AS [Type],
    SUM(Value) AS [Value]
FROM CompanyTypeValues CTV
    JOIN CompanyProfile CP
        ON CP.CompanyId = CTV.CompanyId
WHERE CP.Status = 0 AND Date >= '2015-08-11'
GROUP BY CAST(DATEADD(month, DATEDIFF(month, 0, Date), 0) AS date), TypeId, W2CliendId
ORDER BY TypeId, MonthStarts, W2CliendId

如何从GROUP BY中仅对2个字段求和?(DATEADD(month, DATEDIFF(month, 0, Date), 0), W2CliendId)

EN

回答 2

Stack Overflow用户

发布于 2018-01-11 00:10:05

如果你只有3个类型it (从你的案例中看起来就是上面的总和),一个解决方案是创建三个重复案例的列,这样你就有3个对应于这三个类型it的聚合结果:

因此,在查询的末尾,将

代码语言:javascript
复制
SUM(Value) AS [Value]

通过

代码语言:javascript
复制
SUM(CASE 
      WHEN TypeId = 1 THEN Value
      WHEN TypeId = 2 THEN 0
      WHEN TypeId = 0 THEN 0
END AS [Value_Type1],
SUM(CASE 
      WHEN TypeId = 1 THEN 0
      WHEN TypeId = 2 THEN Value
      WHEN TypeId = 0 THEN 0
END AS [Value_Type2],
SUM(CASE 
      WHEN TypeId = 1 THEN 0
      WHEN TypeId = 2 THEN 0
      WHEN TypeId = 0 THEN Value
END AS [Value_Type0],

Group by不是为了在同一查询的两个不同级别聚合而设计的。否则,您可以做的是两个单独的子查询,一个聚合在3列上,另一个聚合在2列上,并连接这两个查询。

票数 0
EN

Stack Overflow用户

发布于 2018-01-11 02:34:41

如果必须按选定的列进行分区,请尝试使用窗口函数

代码语言:javascript
复制
SELECT   w2cliendid, 
         cast(dateadd(month, datediff(month, 0, date), 0) AS date) AS monthstarts, 
         CASE 
                  WHEN typeid = 1 THEN '4 Search views' 
                  WHEN typeid = 2 THEN '5 Maps views' 
                  WHEN typeid = 0 THEN 'Unknown' 
         END                                                                                                                                         AS [Type],
         sum(value) OVER (partion BY cast(dateadd(month, datediff(month, 0, date), 0) AS date)
         , w2cliendid ORDER BY typeid, monthstarts, w2cliendid) AS [Value] 
FROM     companytypevalues ctv 
JOIN     companyprofile cp 
ON       cp.companyid = ctv.companyid 
WHERE    cp.status = 0 
AND      date >= '2015-08-11'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48190386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档