首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Group BY将多个Select语句放入不同的列

使用Group BY将多个Select语句放入不同的列
EN

Stack Overflow用户
提问于 2018-09-18 17:20:08
回答 4查看 44关注 0票数 1

我有这个表,为了简单起见,我只包含了一个客户名称,它有很多

代码语言:javascript
复制
+--------------+---------------------+---------------+
| customername | customercontactname | statename     |
+--------------+---------------------+---------------+
| IKEA         | Sam                 | Won           |
| IKEA         | Sam                 | Won           |
| IKEA         | Sam                 | Won           |
| IKEA         | Sara                | Won           |
| IKEA         | Sara                | Won           |
| IKEA         | Sara                | Won           |
| IKEA         | Sara                | Won           |
| IKEA         | Amelia              | Lost          |
| IKEA         | Maya                | Won           |
| IKEA         | Maya                | Won           |
+--------------+---------------------+---------------+

我想要这个输出

代码语言:javascript
复制
+--------------+---------------------+---------+----------+
| customername | customercontactname | WonOpps | LostOpps |
+--------------+---------------------+---------+----------+
| IKEA         | Sam                 | 3       | NULL     |
| IKEA         | Sara                | 4       | NULL     |
| IKEA         | Maya                | 2       | NULL     |
| IKEA         | Amelia              | NULL    | 1        |
+--------------+---------------------+---------+----------+

试用(前3行的结果很好,但是Amelia没有显示在我的最终输出中):

代码语言:javascript
复制
SELECT t1.customername, 
       t1.customercontactname, 
       t1.wonopps, 
       t2.lostopps 
FROM   (SELECT customername, 
               customercontactname, 
               Count(*) AS WonOpps 
        FROM   mytable 
        WHERE  statename = 'won' 
        GROUP  BY customername, 
                  customercontactname) t1 
       LEFT JOIN (SELECT customername, 
                         customercontactname, 
                         Count(*) AS LostOpps 
                  FROM   mytable 
                  WHERE  statename = 'lost' 
                  GROUP  BY customername, 
                            customercontactname) t2 
              ON t1.customername = t2.customername 
                 AND t1.customercontactname = t2.customercontactname 
EN

回答 4

Stack Overflow用户

发布于 2018-09-18 17:21:49

使用条件聚合:

代码语言:javascript
复制
   select customername, customercontactname, count(case when statename='Won' then 1 end ) WonOpps,
   count(case when statename='Lost' then 1 end ) WonLost
   from tablename
   group by customername, customercontactname
票数 1
EN

Stack Overflow用户

发布于 2018-09-18 17:23:37

使用sum

代码语言:javascript
复制
 with t1 as
     (
       select customername,
       customercontactname,
       sum(case when statename='won' then 1 else 0 end ) as WonOpps,
       sum(case when statename='loss' then 1 else 0 end ) as LostOpps
       from t
       group by customername, customercontactname
) select customername,customercontactname, case when WonOpps>1 then WonOpps else null end as WonOpps,
case when LostOpps>1 then LostOpps else LostOpps end as LostOpps from t1
票数 0
EN

Stack Overflow用户

发布于 2018-09-18 17:37:12

您可以将SUMCASE WHEN结合使用

代码语言:javascript
复制
SELECT    customername,
          customercontactname,
          SUM(CASE WHEN statename = 'Won'  THEN 1 END) AS WonOpps,
          SUM(CASE WHEN statename = 'Lost' THEN 1 END) AS WonLost
FROM      mytable
GROUP BY  customername, customercontactname

如果没有匹配的记录,则SUM返回NULL,因为我们没有指定ELSE-values。

如果您希望看到0,那么可以添加ELSE 0,也可以使用COUNT而不是SUM

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

https://stackoverflow.com/questions/52383167

复制
相关文章

相似问题

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