【问题标题】:Mysql get sub list with countMysql获取带有计数的子列表
【发布时间】:2014-02-15 11:13:55
【问题描述】:

我有这种形式的表格数据。

it w count
i1 a 2  
i1 b 3
i2 a 1
i3 c 2
i4 b 1

当我为每个项目(它)和相应的计数查询 a-b 对时。如果某个项目(它)没有 a 和 b,那么它会被忽略(如 i3)。我需要表单中的输出

it a b 
i1 2 3
i2 1 0
i4 0 1

任何想法如何解决这个问题? 而且我不能将每个单词存储在不同的列中。单词很多,mXn矩阵是稀疏的。

根据 Saharsh 的回答,我们可以这样做

SELECT * FROM (SELECT a.it, SUM(CASE WHEN a.w = 'a' THEN a.count ELSE 0 END) AS a,
SUM(CASE WHEN a.w = 'b' THEN a.count ELSE 0 END) AS b 
FROM tableA a WHERE a.w IN ('a', 'b') GROUP BY a.it) WHERE a>0 OR b>0

有没有更好的方法来处理百万行数据?

【问题讨论】:

    标签: mysql sql select group-by pivot


    【解决方案1】:

    您可以使用条件聚合来做到这一点:

    select it, max(case when w = 'a' then count else 0 end) as a,
           max(case when w = 'b' then count else 0 end) as b
    from table t
    where w in ('a', 'b')
    group by it;
    

    【讨论】:

    • 这里的输出也包括 i3 项。通过返回空值。
    【解决方案2】:

    试试这个:

    SELECT a.it, 
           SUM(CASE WHEN a.w = 'a' THEN a.count ELSE 0 END) AS a, 
           SUM(CASE WHEN a.w = 'b' THEN a.count ELSE 0 END) AS b
    FROM tableA a 
    WHERE a.w IN ('a', 'b')
    GROUP BY a.it;
    

    查看SQL FIDDLE DEMO

    输出

    | IT | A | B |
    |----|---|---|
    | i1 | 2 | 3 |
    | i2 | 1 | 0 |
    | i4 | 0 | 1 |
    

    【讨论】:

    • i3 项目不应包含在结果集中,因为 a、b 都不存在。一种方法是对此 SELECT * FROM (SELECT a.it, SUM(CASE WHEN aw = 'a' THEN a.count ELSE 0 END) AS a, SUM(CASE WHEN aw = 'b' THEN a.count) 运行查询ELSE 0 END) AS b FROM tableA a WHERE aw IN ('a', 'b') GROUP BY a.it) WHERE a>0 OR b>0 。有没有更好的办法?
    • @user2517372 不用子查询,直接取记录即可
    • @user2517372 检查小提琴演示以验证输出
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多