如何将变量名称分配给SQL查询别名列名?

时间:2015-10-12 17:21:08

标签: sql

我希望有聚合查询来计算两个日期之间的记录,我希望结果在别名列名称为startDay - 结束日,即假设我想在2015年1月1日到2015年1月5日之间记录计数,那么我希望在列头像“1 - 5”。

2 个答案:

答案 0 :(得分:1)

警告:我不认为这是个好主意。您应该使用通用列名称,从长远来看,它将为您节省很多麻烦,特别是因为用户不太可能真正了解这样的列名称的含义。如果用户希望轻松查看报告的运行日期,最好将开始日期和结束日期作为单个列返回。然而,这是一个不完美的世界,有时我们会遇到迫使我们陷入不完美解决方案的要求。 (但是要推回这个,至少尽量不这样做,因为这是一个可怕的想法。)

在这种情况下,我想到你想根据作为查询参数发送的日期来改变列名,如果日期是从1日到5日,你会想要1-5如果日期是20日至25日,您需要20-25作为列名。要做到这一点,你需要动态SQl,这是一个很难写,甚至更糟糕的测试。它也可能是一场安全噩梦。如果你受到约束并决定做这个愚蠢的事情,那么这大致是如何做到的:

declare  @startdate date=  '2015/01/01'
, @enddate date='2015/01/05'
, @test varchar (10)
set @test = cast( day(@startdate) as varchar (2)) +'-' +  cast( day(@enddate) as varchar (2))


declare @Sql varchar(max)
set @sql = 'select top 10 id, field1 - field2  as ' 
+''''+@test+'''' + ' from table1
where date_entered >' +cast(@startdate as varchar(10))+
' and date_entered <= ' + cast(@enddate as varchar(10))

EXECUTE sp_executesql @SQL

实际上你应该为执行sp_executesql语句设置参数值,但我作弊是因为你只会传递难以用于sql注入攻击的日期。无论如何,在您阅读并彻底理解以下链接之前,请不要考虑这样做:

  

http://www.sommarskog.se/dynamic_sql.html

动态SQL可能非常危险,应该避免使用,特别是当它只是需要使用它的化妆品时。不应该轻易使用它,也不应该理解你正在做的事情的总体含义。

答案 1 :(得分:-1)

好的,这里缺乏描述是我尝试找出你想要的东西的最佳尝试。如果我完全离开,我道歉。

基本上,如果您正在寻找自定义列名称,并且还希望列具有多个日期范围。例如:如果您希望一列具有1月1日到1月6日之间的值...则在1月7日到1月13日之间的另一列日期......依此类推。然后你需要看看类似于我在下面列出的子查询。

您可以编写子查询,仅选择您要查找的范围的数据,然后将其连接回您要拉的主表。

注意:如果你使用这种方法,你会在你的查询中弹出很多空值,这样你就可以根据需要过滤掉它们,但这对于你如何进行连接有很大不同子查询。

SELECT 
ID
X.Jan1toJan6 AS [custom column name]
FROM
TABLE1
INNER JOIN
(SELECT DISTINCT 
ID,
[UpdateDate] as Jan1toJan6
FROM [table1]
WHERE [UpdateDate] BETWEEN '2008-01-01' AND '2008-01-06') as X
ON X.ID = Table1.ID