如何在SELECT COUNT语句中使用CASE语句?

时间:2016-12-20 11:02:05

标签: sql-server tsql count case

我需要做一个案例陈述。

根据变量值的不同,需要从表中选择正确的列

StartDate和EndDate是不同的变量。

我创建了一个名为Region的变量,它应该确定查询选择的列。

编辑:地区可以是' EW'对于英格兰和威尔士来说,' SC'对于苏格兰或者' NI'为北爱尔兰。 如果是EW,则应选择第1列,SC为第2列,NI为第3列

SELECT
COUNT(COLUMN1)
FROM  bankholidays
WHERE COLUMN1 BETWEEN @StartDate AND @EndDate)

6 个答案:

答案 0 :(得分:2)

假设您要计算开始日期和结束日期之间Column1的记录数,那么以下内容应该有效:

SELECT SUM(CASE WHEN COLUMN1 BETWEEN @StartDate AND @EndDate
           THEN 1 ELSE 0 END) AS tally
FROM bankholidays

这种方法称为条件聚合,通常也会使用GROUP BY子句。

<强>更新

要处理@Region变量,查询可能如下所示:

SELECT CASE WHEN @Region = 'val1' THEN COLUMN1
            WHEN @Region = 'val2' THEN COLUMN2
            WHEN @Region = 'val3' THEN COLUMN3
       END AS new_column   
FROM bankholidays

请注意,我没有尝试将其与第一个查询结合使用,因为它会将聚合函数与非聚合术语混合在一起,而且可能没有意义。

答案 1 :(得分:1)

1)如果您不关心从计数中排除空值,则无需在COUNT语句中指定列名。即。

select count(Column1)

将提供与

相同的结果
select count(1)

select count(*)

只要column1没有空值。如果column1确实包含空值,则不对它们进行计数(因此,如果有10条记录,其中3条记录在column1中为空值,则使用count(column1)得到7的结果,使用另一列得到10的结果方法

我首先提到这一点,好像你关心空值然后改变这里使用哪一列是有意义的;如果不这样做,请使用更简单的逻辑count(1) / counnt(*)

所有这一切,以下是如何更改该列:

select count(
    case @Region 
        when 1 then Column1 
        when 2 then Column2 
        else Column3 
    end
)

2)如果要更改WHERE语句中使用的列,可以采用以下几种方法:

SELECT COUNT(1)
FROM  bankholidays
WHERE case @Region 
    when 1 then Column1 
    when 2 then Column2 
    else Column3        
end BETWEEN @StartDate AND @EndDate

SELECT COUNT(1)
FROM  bankholidays
WHERE (@Region = 1 and Column1 BETWEEN @StartDate AND @EndDate)
or (@Region = 2 and Column2 BETWEEN @StartDate AND @EndDate
or (@Region not in (1,2) and Column3 BETWEEN @StartDate AND @EndDate

就我个人而言,我更喜欢上面的第一种风格,因为它涉及较少的重复;然而第二种风格提供了使用不同的开始和放大的选项。不同列的结束日期,或者添加其他逻辑,所以仍然值得注意。

答案 2 :(得分:1)

SELECT CASE
WHEN @Region = 'EW' THEN columnName
WHEN @Region = 'SC' THEN columnName
WHEN @Region = 'NI' THEN columnName
END AS newColumnName FROM bankholidaysT

尝试这样的事情

答案 3 :(得分:0)

如果要动态计算给定列值在两个日期之间的记录,请使用动态查询:

DECLARE @column NVARCHAR(MAX)
DECLARE @sql NVARCHAR(MAX)

SET @column = 'COLUMN1' --Set your desired column here
SET @sql = 'SELECT COUNT(*) FROM bankholidays WHERE ' + @column + ' BETWEEN ''' + CONVERT(NVARCHAR,@StartDate,121) + ''' AND ''' + CONVERT(NVARCHAR,@EndDate,121) + ''''

EXEC @sql

答案 4 :(得分:0)

尝试如果您想要count并动态检查列

DECLARE @sql VARCHAR(500), 
    @Region VARCHAR(100) = 'COLUMN2', --It can be Column1, Column2.....
    @StartDate DATETIME = '2016-04-10',
    @EndDate DATETIME = '2016-04-15'

SET @sql = '
    SELECT
    COUNT(' + @Region + ')
    FROM  bankholidays
    WHERE ' + @Region + ' BETWEEN ''' + CAST(@StartDate AS VARCHAR) + ''' AND ''' + CAST(@EndDate AS VARCHAR) + ''''

EXEC (@SQL)

- 查询执行如下

SELECT
COUNT(COLUMN2)--It can be Column1, Column2.....
FROM  bankholidays
WHERE COLUMN2 BETWEEN 'Apr 10 2016 12:00AM' AND 'Apr 15 2016 12:00AM'

答案 5 :(得分:-1)

declare  @Region  varchar(10)
set @Region='EW'

SELECT 
COUNT(*) OVER(PARTITION BY 1) as TotalRows,
Case  
    when @Region ='EW' THEN   Column1 
    when @Region ='SC' THEN   Column2
    when @Region ='NI' THEN   Column3
end as [NewColumn]
FROM [BankHolidays] 
WHERE COLUMN1 BETWEEN @StartDate AND @EndDate