【问题标题】:Create custom groups on columns and count another column in sql在列上创建自定义组并计算 sql 中的另一列
【发布时间】:2023-03-17 17:00:02
【问题描述】:

我正在使用 sql server,我有一个名为 Table 的表,看起来像这样。

SenderId ReciverId ItemCount
1 2 5
1 4 3
1 6 4
2 1 2
2 5 6
3 1 1
4 3 7
4 5 4
5 2 6
5 4 2
5 6 6
6 4 3

我想将 SenderIds 和 ReciverIds 分组。然后我想合计这些组之间的 ItemCount。分组如下。

SenderId 1 = 第一个。 SenderIds 2,3 = 第二。 SenderIds = 4,5,6 = 第三 ReciverId 1 = 第一个。 ReciverIds 2,3 = 第二。 ReciverIds = 4,5,6 = 第三

我想返回以下内容

SenderGroup ReceiverGroup ItemCount
First First 0
First Second 5
First Third 7
Second First 3
Second Second 0
Second Third 6
Third First 0
Third Second 13
Third Third 15

我尝试了几个不同的查询,但都没有成功。这是我目前所拥有的一些内容。

SELECT 'First' AS SenderGroup, COUNT(ItemCount) AS ItemCount
FROM Table
WHERE SenderId IN (1)

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    要获得您期望的确切结果,您可以使用 cte 首先构建自定义组,然后创建从与 cte 连接的表中获取相关数据。

    查询类似于

    with dummyMap AS (
      select 1 as id, 'First' as des UNION ALL 
      select 2, 'Second' UNION ALL 
      select 3, 'Second' UNION ALL 
      select 4, 'Third' UNION ALL 
      select 5, 'Third' UNION ALL 
      select 6, 'Third' 
    )
    select  sndrMap.des 'SenderGroup', rcvrMap.des 'ReceiverGroup', sum(isnull(ItemCount,0)) 'ItemCount'
    from dummyMap sndrMap 
    cross join dummyMap rcvrMap 
    left join <your-table> on ReciverId = rcvrMap.id and SenderId = sndrMap.id
    group by sndrMap.des, rcvrMap.des 
    order by 
        case sndrMap.des when 'First' then 1 when 'Second' then 2 else 3 end asc, 
        case rcvrMap.des when 'First' then 1 when 'Second' then 2 else 3 end asc 
    

    here是个小提琴

    【讨论】:

    • VALUES 表构造函数将比 UNION ALL 更简单,例如 with dummyMap AS (select * FROM (1, 'First'), (2, 'Second'), ..... ) v(id, des) )
    【解决方案2】:

    您可以在这里使用最小/最大技巧,然后按发送者和接收者聚合并找到计数:

    WITH cte AS (
        SELECT CASE WHEN SenderId < ReciverId
                    THEN SenderId ELSE ReciverId END AS SenderGroup,
               CASE WHEN SenderId < ReciverId
                    THEN ReciverId ELSE SenderId END AS ReceiverGroup,
               ItemCount
        FROM yourTable
    )
    
    SELECT SenderGroup, ReceiverGroup, SUM(ItemCount) AS ItemCount
    FROM cte
    GROUP BY SenderGroup, ReceiverGroup;
    

    Demo

    【讨论】:

    • 这不会创建我需要的 SenderIds 和 ReciverIds 的自定义组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2019-03-27
    • 1970-01-01
    • 2021-12-08
    • 2018-02-21
    • 2011-08-04
    相关资源
    最近更新 更多