我很难计算 SQL 数据库中的条目。我需要连续计算所有具有相同值的条目。向下一列中的条目计数我没有问题,但似乎无法正确计算行数。有人可以帮忙吗?
姓名 | 第一天 | 第2天 | 第三天 |
---|---|---|---|
名字 1 | D | D | N |
姓名 2 | D | N | N |
姓名 3 | D | D | D |
姓名 4 | N | D | D |
示例:从 MyTable 中选择 count(Day1) 作为 [Day Shift],其中 Day1 = 'D' 结果:3
我需要数 Name1 D。结果必须是 Name1 = 2.
有人可以帮忙吗?
提前谢谢你。
梅尔
select count(case when Day1 = 'D' then 1 else null end) as [Off Days] 来自 mYtABLE
仍然得到相同的结果。
您可以使用条件聚合来做到这一点:
select Name, max(Day1) as Day1, max(Day2) as Day2, max(Day3) as Day3,
COUNT(case when Day1='D' then 1 end) +
COUNT(case when Day2='D' then 1 end) +
COUNT(case when Day3='D' then 1 end)
as number_of_D
from mytable
group by Name
结果:
Name Day1 Day2 Day3 number_of_D
Name1 D D N 2
Name2 D N N 1
Name3 D D D 3
Name4 N D D 2
此解决方案适用于 mysql、postgresql 和许多其他解决方案
看到并欣赏@SelVazi 的回答,但是我不太明白 GROUP BY 和 max() 函数的必要性。这似乎同样有效,而且更简单:
select name,
(case when day1 = 'D' then 1 else 0 end) +
(case when day2 = 'D' then 1 else 0 end) +
(case when day3 = 'D' then 1 else 0 end)
from mytable;
谢谢你们,你们摇滚!知道了
由于您的问题仅描述了想要检查列数很少的表上单个特定值的数量,因此这里有一个稍微有点老套的方法。
DECLARE @vCode CHAR(1) = 'D'
SELECT
Name,
IIF(Day1 = @vCode, 1, 0)
+ IIF(Day2 = @vCode, 1, 0)
+ IIF(Day3 = @vCode, 1, 0)
AS Shift
FROM mYtABLE
如果您需要为一个表执行此操作,而不仅仅是所描述的少数几列,和/或如果您需要为多个列执行此操作,而不仅仅是单个/特定值,我会检查 cursors.
编辑:我添加了
@vCode
变量,因此您可以根据需要将该值更改为 D、N 等以更改查询。