首页
学习
活动
专区
圈层
工具
发布

列的和
EN

Stack Overflow用户
提问于 2017-10-09 15:51:16
回答 2查看 53关注 0票数 1

我有一个sql查询:

代码语言:javascript
复制
SELECT distinct USERID,
case when ACTVCODE = 'POC' then count(ACTVCODE) end POC, 
case when ACTVCODE = 'PIC' then count(ACTVCODE) end PIC, 
case when ACTVCODE = 'EML' then count(ACTVCODE) end EML,
case when ACTVCODE = 'AD' then count(ACTVCODE) end AD, 
case when ACTVCODE = 'LOG' then count(ACTVCODE) end LOG, 
case when RESULTCODE = 'SR' then count(ACTVCODE) end SR, 
case when RESULTCODE = 'DM' then count(ACTVCODE) end DM, 
case when RESULTCODE = 'GK' then count(ACTVCODE) end GK, 
case when RESULTCODE = 'AM' then count(ACTVCODE) end AM, 
case when RESULTCODE = 'NA' then count(ACTVCODE) end NA, 
case when RESULTCODE = 'RO' then count(ACTVCODE) end RO, 
case when RESULTCODE = 'ORE' then count(ACTVCODE) end ORE, 
case when RESULTCODE = 'COM' then count(ACTVCODE) end COM, 
case when RESULTCODE = 'SMS' then count(ACTVCODE) end SMS, 
case when RESULTCODE = 'SV' then count(ACTVCODE) end SV, 
case when RESULTCODE = 'QUO' then count(ACTVCODE) end QUO, 
case when RESULTCODE = 'PQU' then count(ACTVCODE) end PQU
FROM GoldMine.dbo.RESULT_COUNTS RESULT_COUNTS, GoldMine.dbo.USERGRP USERGRP, 
GoldMine.dbo.WT_GMUser WT_GMUser WHERE (RESULT_COUNTS.ONDATE>= '10/3/2017' 
And RESULT_COUNTS.ONDATE<= '10/3/2017') AND 
(RESULT_COUNTS.USERID=WT_GMUser.USERNAME) AND (WT_GMUser.Memberships Like 
'%Corp%') GROUP BY  RESULT_COUNTS.USERID,  RESULT_COUNTS.ACTVCODE, 
RESULT_COUNTS.RESULTCODE

下面是它生成的数据的示例:

我试图得到用户名只显示一次的地方,并且列中有一个值之和。我认为使用"Distinct“会使用户名只出现一次,但它的工作方式与我所期望的不一样。我的问题是,我可以在我的sql语句中添加什么,以获得每个USERID的一行和之后每列的所有值的总和。

如果你还需要更多的信息请告诉我。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 15:55:13

我认为您正在寻找条件聚合。看起来会是这样的:

代码语言:javascript
复制
SELECT rc.USERID,
       sum(case when rc.ACTVCODE = 'POC' then 1 else 0 end) as POC, 
       sum(case when rc.ACTVCODE = 'PIC' then 1 else 0 end) as PIC, 
       . . .
FROM GoldMine.dbo.RESULT_COUNTS rc JOIN
     GoldMine.dbo.WT_GMUser u
     ON rc.USERID = u.USERNAME
WHERE rc.ONDATE >= '2017-10-03' AND
      rc.ONDATE <= '2017-10-03' AND 
      u.Memberships Like '%Corp%'
GROUP BY rc.USERID;

备注:

  • 在用户组上,您似乎缺少了一个JOIN条件,而查询中不使用该表。所以我把那张桌子搬走了。
  • 不要在FROM子句中使用逗号。始终使用正确、显式的JOIN语法。
  • 如果要定义表别名,请将它们改为缩写。查询更易于编写和读取。
  • 当查询引用多个表时,限定所有列名。
  • 使用ISO标准日期格式。
票数 3
EN

Stack Overflow用户

发布于 2017-10-09 15:56:19

所以您希望每个RESULT_COUNTS.USERID只需要一行

代码语言:javascript
复制
...
GROUP BY RESULT_COUNTS.USERID;

然后有一个列,其中包含ACTVCODE = 'POC'的行数。

代码语言:javascript
复制
SELECT
  COUNT(CASE WHEN ACTVCODE = 'POC' THEN 1 END) POC,

case表达式将其他行映射到null (由于case的隐含else null子句)。nullcount忽略,因此它只返回ACTVCODE = 'POC'所在的行数。

对于其他列也可以使用相同的技术。

有关此技术的更多信息:http://modern-sql.com/use-case/pivot

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46650404

复制
相关文章

相似问题

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