我是SQL的新手,我需要你的帮助。
我有一个包含Name
列和Value
列的表格。
此值代表3值枚举,我们说Yes
,No
和Maybe
。
我试图计算每个名字,我有多少次枚举的每个值。像这样:
Name1 Yes 3
Name1 No 1
Name1 Maybe 4
Name2 Yes 0
Name2 No 1
Name2 Maybe 2
Name3 Yes 1
Name3 No 0
Name3 Maybe 7
但有时候我没有任何具有给定值的给定名称的条目,并且它不会显示。很快,当计数为0时,我没有得到这一行。 我必须把它放在一个存储过程中。
我怎样才能做到这一点? 提前谢谢大家!
P.S。我使用的是SQL Server
编辑:
我尝试的是:
SELECT Name,
Value,
COUNT(Value) as ValueCount
from Data
group by Name, Value
order by Name
答案 0 :(得分:2)
使用cross join
生成所有行。然后使用left join
加入计数值:
SELECT n.Name, v.value, COUNT(d.value) as ValueCount
from (select distinct name from Data) n cross join
(select distinct value from Data) v left join
data d
on d.name = n.name and d.value = v.value
group by n.Name, v.Value
order by n.Name;
您没有指定数据库。这是标准SQL,应该适用于任何数据库。
答案 1 :(得分:1)
您可以使用两个cte获取要显示的所有组合的列表,然后使用原始表格进行左连接。
WITH enum AS
(
SELECT 'Yes' AS Value
UNION
SELECT 'No'
UNION
SELECT 'Maybe'
), combs AS
(
SELECT DISTINCT d.Name, e.Value
FROM enum e, Data d
)
SELECT c.Name, c.Value, COUNT(d.Name) FROM combs c
LEFT JOIN data d ON d.Name = c.Name AND d.Value = c.Value
GROUP BY c.Name, c.Value
ORDER BY c.Name, c.Value
答案 2 :(得分:0)
整体看着你的桌子,它会像这样清洁得多:
Name Yes No Maybe
__________________________
Bob 3 4 0
Tim 0 1 3
Jim 2 7 2
我知道这不是解决问题的真正答案,但是这个表格要小得多,并且会得到相同的结果。
答案 3 :(得分:0)
通常在尝试计算不存在的东西时,最好加入到驱动程序表中,在这种情况下,您需要所有名称/值对加入,在下面简单地创建cte
使用CROSS JOIN
,但您可以通过多种方式提取值:
;with cte AS (SELECT DISTINCT d1.name,d2.value
FROM data d1
CROSS JOIN data d2
)
SELECT cte.Name,
cte.Value,
COALESCE(COUNT(d.Value),0) as ValueCount
from cte
LEFT JOIN Data d
ON d.value = cte.value
AND d.name = cte.name
group by cte.Name, cte.Value
order by cte.Name
由于这需要LEFT JOIN
任何缺失的值都会返回NULL
,因此COALESCE()
用于显示0
。