在列上创建自定义组并计算 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 中的另一列的主要内容,如果未能解决你的问题,请参考以下文章