如何在SQL Server中添加显示带条件表中总行数的列

q43xntqr  于 2023-01-20  发布在  SQL Server
关注(0)|答案(2)|浏览(143)

我有这个表,我想添加列总结它:
现在列表:
| 姓名|PAT_ID|有_T|有_Y|有_G|
| - ------|- ------|- ------|- ------|- ------|
| 布莱恩|一百二十三|十||十|
| 布莱恩|三五六|十|十||
| 布莱恩|小行星3546||十|十|
| 布莱恩|九八七|十|||
我希望在表中添加计算数据的列,并在每一行中给出一个值:
预期输出:
| 姓名|PAT_ID|有_T|有_Y|有_G|总计_T|总计_Y|总计_PATS|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 布莱恩|一百二十三|十||十|三个|第二章|四个|
| 布莱恩|三五六|十|十||三个|第二章|四个|
| 布莱恩|小行星3546||十|十|三个|第二章|四个|
| 布莱恩|九八七|十|||三个|第二章|四个|
有人帮我完成了最后一个(Total_PATS),使用以下代码计算所有行:

COUNT(*) OVER () AS [total]      << for all rows.

如何用条件来做?我有'X'所以我想统计所有has_T有X的行...

lxkprmvk

lxkprmvk1#

当你存储空白值或空格值时,COUNT仍然会计算这些值l COUNT * 计数 * 非NULL值。理想情况下,你应该存储NULL,而不是''' '(甚至' '),这会使COUNT更容易地处理这些值。
但是,您可以将NULL中的值:

SELECT name,
       pat_id,
       has_t,
       has_y,
       has_g,
       COUNT(NULLIF(has_t,'')) OVER() AS total_t,
       COUNT(NULLIF(has_y,'')) OVER() AS total_y,
       COUNT(NULLIF(has_g,'')) OVER() AS total_g,
       COUNT(*) OVER() AS total
FROM dbo.Yourtable;
xpcnnkqh

xpcnnkqh2#

我们可以将条件计数用于CASE

SELECT 
name, pat_id, has_t, has_y, has_g,
COUNT (CASE WHEN has_t = 'X' THEN 1 END) OVER() AS Total_T,
COUNT (CASE WHEN has_y = 'X' THEN 1 END) OVER() AS Total_Y,
COUNT (CASE WHEN has_g = 'X' THEN 1 END) OVER() AS Total_G,
COUNT (*) OVER() AS Total_PATS
FROM yourtable;

这将仅计算X值。
正如在注解中所说的,使用NULL而不是空格/空字符串会更好,例如,因为COUNT忽略NULL,所以我们可以简单地写COUNT(has_t)等。

相关问题