我需要做一个案例陈述。
根据变量值的不同,需要从表中选择正确的列
StartDate和EndDate是不同的变量。
我创建了一个名为Region的变量,它应该确定查询选择的列。
编辑:地区可以是' EW'对于英格兰和威尔士来说,' SC'对于苏格兰或者' NI'为北爱尔兰。 如果是EW,则应选择第1列,SC为第2列,NI为第3列
SELECT
COUNT(COLUMN1)
FROM bankholidays
WHERE COLUMN1 BETWEEN @StartDate AND @EndDate)
答案 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