计算 SQL 条目

问题描述 投票:0回答:4

我很难计算 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

仍然得到相同的结果。

sql count row
4个回答
0
投票

您可以使用条件聚合来做到这一点:

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 和许多其他解决方案


0
投票

看到并欣赏@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;

0
投票

谢谢你们,你们摇滚!知道了


0
投票

由于您的问题仅描述了想要检查列数很少的表上单个特定值的数量,因此这里有一个稍微有点老套的方法。

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 等以更改查询。

© www.soinside.com 2019 - 2024. All rights reserved.