在列上创建自定义组并计算 sql 中的另一列

Posted

技术标签:

【中文标题】在列上创建自定义组并计算 sql 中的另一列【英文标题】:Create custom groups on columns and count another column in sql 【发布时间】:2022-01-20 05:36:18 【问题描述】:

我正在使用 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)

【问题讨论】:

【参考方案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 的自定义组。

以上是关于在列上创建自定义组并计算 sql 中的另一列的主要内容,如果未能解决你的问题,请参考以下文章

SQL:根据另一列的值在列上保留一个具有最大值的行

MySQL sum 和 distinct 在具有多个连接的另一列上

如何根据python中的另一列自动添加日期?

GridControl列自定义排序

SQL自定义排序依据

CSS布局 , 单列宽度固定,另一列自适应。