列的总和

时间:2017-10-09 15:51:16

标签: sql asp.net vb.net

我有这个SQL查询:

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

这是它产生的数据样本:

Sample

我试图获取用户名仅显示一次的位置,并且列中有一个值的总和。我想过用#34; Distinct&#34;会使用户名只出现一次,但它没有按我预期的方式工作。我的问题是我可以添加到我的sql语句中以获得每个USERID一行以及之后每列的所有值的总和。

如果您需要更多信息,请与我们联系。感谢

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找条件聚合。它看起来像这样:

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标准日期格式。

答案 1 :(得分:0)

所以你想要每RESULT_COUNTS.USERID行一行:

...
GROUP BY RESULT_COUNTS.USERID;

然后是一列,其中行数为ACTVCODE = 'POC'

SELECT
  COUNT(CASE WHEN ACTVCODE = 'POC' THEN 1 END) POC,

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

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

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