是否可以将 Count( ) 函数与 WHERE 条件一起使用?
Is it possible to use Count( ) function with WHERE Condition?
考虑这个table“蟋蟀”
团队 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.[Team 2],c.[Winner]
Order by c.[Date]
但是当获胜者不是新西兰时,我想在“NewZelandWon”列中得到 NULL
如何将 Where 条件或任何其他条件与 Count() 函数一起使用?
我想要的输出如下:
团队 1
团队 2
获胜者
日期
新西兰元
新西兰
巴基斯坦
新西兰
2018-01-06
1
新西兰
英国
新西兰
2018-01-09
2
新西兰
印度
印度
2018-01-13
空
新西兰
孟加拉国
新西兰
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.[Team 2],c.[Winner]
Order by c.[Date]
我会使用连接来做到这一点。
SELECT c.[Team 1],c.[Team 2],c.[Winner], c.[Date], 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], c.[Team 2], c.[Winner], c.[Date],
(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
没有必要,所以我删除了它。
考虑这个table“蟋蟀”
团队 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.[Team 2],c.[Winner]
Order by c.[Date]
但是当获胜者不是新西兰时,我想在“NewZelandWon”列中得到 NULL 如何将 Where 条件或任何其他条件与 Count() 函数一起使用?
我想要的输出如下:
团队 1 | 团队 2 | 获胜者 | 日期 | 新西兰元 |
---|---|---|---|---|
新西兰 | 巴基斯坦 | 新西兰 | 2018-01-06 | 1 |
新西兰 | 英国 | 新西兰 | 2018-01-09 | 2 |
新西兰 | 印度 | 印度 | 2018-01-13 | 空 |
新西兰 | 孟加拉国 | 新西兰 | 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.[Team 2],c.[Winner]
Order by c.[Date]
我会使用连接来做到这一点。
SELECT c.[Team 1],c.[Team 2],c.[Winner], c.[Date], 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], c.[Team 2], c.[Winner], c.[Date],
(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
没有必要,所以我删除了它。