【问题标题】:Summarize value counts per value in 1 column in SQL Server汇总 SQL Server 中 1 列中每个值的值计数
【发布时间】:2019-10-14 13:56:13
【问题描述】:

数据:

name | car color
-----+---------
mike | green
mike | blue
mike | red
bob  | green
bob  | red
tom  | blue

想要的结果:

name | green count | blue count | red count
-----+-------------+------------+---------
mike |      1      |      1     |    1
bob  |      1      |      0     |    1
tom  |      0      |      1     |    0

我正在考虑运行几个子查询并离开加入,例如:

select name, count(*) as count blue
from table
where car color = 'blue'

谢谢

【问题讨论】:

  • 你知道设计时所有可能的颜色吗?
  • 我通常运行不同的先验。

标签: sql sql-server tsql group-by pivot


【解决方案1】:

您可以使用条件聚合:

SELECT 
    name,
    SUM(CASE WHEN car_color = 'green' THEN 1 ELSE 0 END) green_count,
    SUM(CASE WHEN car_color = 'blue' THEN 1 ELSE 0 END) blue_count,
    SUM(CASE WHEN car_color = 'red' THEN 1 ELSE 0 END) red_count
FROM mytable 
GROUP BY name

【讨论】:

    【解决方案2】:

    如果您在设计时就知道颜色,则可以使用枢轴。

    DECLARE @t TABLE
    (
        personName NVARCHAR(16) NOT NULL,
        carColor NVARCHAR(16) NOT NULL
    );
    
    INSERT INTO @t
    (
        personName,
        carColor
    )
    VALUES
    ('mike', 'green'),
    ('mike', 'blue'),
    ('mike', 'red'),
    ('bob', 'green'),
    ('bob', 'red'),
    ('tom', 'blue');
    
    SELECT t.personName,
           t.red,
           t.blue,
           t.green
    FROM
    (
        SELECT pvt.*
        FROM @t t
            PIVOT
            (
                COUNT(carColor)
                FOR carColor IN ([green], [blue], [red])
            ) pvt
    ) AS t;
    

    输出:

    bob     1   0   1
    mike    1   1   1
    tom     0   1   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2023-01-08
      相关资源
      最近更新 更多