是否可以将 Count() 函数与 WHERE 条件一起使用?

问题描述

考虑这张桌子“板球”

团队 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 不是必需的,所以我删除了它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...