我正在使用 sql server,我有一個名為 Table 的表,看起來像這樣。
| 發件人ID | 接收者 ID | 專案數 |
|---|---|---|
| 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 = 第三
我想回傳以下內容
| 發件人組 | 接收組 | 專案數 |
|---|---|---|
| 第一的 | 第一的 | 0 |
| 第一的 | 第二 | 5 |
| 第一的 | 第三 | 7 |
| 第二 | 第一的 | 3 |
| 第二 | 第二 | 0 |
| 第二 | 第三 | 6 |
| 第三 | 第一的 | 0 |
| 第三 | 第二 | 13 |
| 第三 | 第三 | 15 |
我嘗試了幾個不同的查詢,但沒有取得多大成功。這是我到目前為止的一些內容。
SELECT 'First' AS SenderGroup, COUNT(ItemCount) AS ItemCount
FROM Table
WHERE SenderId IN (1)
uj5u.com熱心網友回復:
要獲得您期望的確切結果,您可以使用 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
這是一把小提琴
uj5u.com熱心網友回復:
您可以在這里使用最少/最大的技巧,然后按發送方和接收方匯總并找到計數:
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;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384636.html
標籤:sql sql-server
上一篇:SQLWhere子句順序
