问题描述
考虑这张桌子“板球”
团队 1 | 团队 2 | 获胜者 | 日期 | 新西兰获胜 |
---|---|---|---|---|
新西兰 | 巴基斯坦 | 新西兰 | 2018-01-06 | 1 |
新西兰 | 英格兰 | 新西兰 | 2018-01-09 | 2 |
新西兰 | 印度 | 印度 | 2018-01-13 | 1 |
新西兰 | 孟加拉国 | 新西兰 | 2018-01-16 | 3 |
我通过查询获得了上述结果:
SELECT c.[Team 1],c.[Team 2],c.[Winner],c.[Date],COUNT(*)OVER (Partition by c.[Winner] order by c.[Date]) AS NewZealandWon
FROM Cricket c
Group by c.[Date],c.[Team 1],c.[Winner]
Order by c.[Date]
但是当获胜者不是新西兰时,我想在“NewZelandWon”列中获得 NULL 我如何在 Count() 函数中使用 Where 条件或任何其他条件?
我想要的输出如下:
团队 1 | 团队 2 | 获胜者 | 日期 | 新西兰获胜 |
---|---|---|---|---|
新西兰 | 巴基斯坦 | 新西兰 | 2018-01-06 | 1 |
新西兰 | 英格兰 | 新西兰 | 2018-01-09 | 2 |
新西兰 | 印度 | 印度 | 2018-01-13 | NULL |
新西兰 | 孟加拉国 | 新西兰 | 2018-01-16 | 3 |
解决方法
测试
SELECT c.[Team 1],c.[Team 2],c.[Winner],c.[Date],COUNT(CASE WHEN c.[Team 1] = c.[Winner] THEN 1 END) OVER (PARTITION BY c.[Winner]) AS NewZealandWon
FROM Cricket c
Group by c.[Date],c.[Team 1],c.[Winner]
Order by c.[Date]
,
我会使用连接来做到这一点。
SELECT c.[Team 1],w.[NewZealandWon]
FROM Cricket c
LEFT JOIN (SELECT [Date],COUNT(*) AS NewZealandWon FROM Cricket WHERE [Winner]='New Zealand' GROUP BY [Date]) w ON w.[Date]=c.[Date]
顺便说一句,你的问题被标记为“mysql”,但查询看起来像“mssql”;也许你应该纠正一下;)
,首先,我会推荐 ROW_NUMBER()
而不是 COUNT(*)
。尽管它们略有不同(ORDER BY
中存在重复项时会产生不同的结果),但 ROW_NUMBER()
更适合您想要执行的操作。
其次,您只需要一个 CASE
表达式:
SELECT c.[Team 1],(CASE WHEN c.Winner = 'New Zealand'
THEN ROW_NUMBER() OVER (Partition by c.Winner order by c.[Date])
END) AS NewZealandWon
FROM Cricket c
ORDER BY c.[Date];
我认为 GROUP BY
不是必需的,所以我删除了它。