如何在SQL中将列标题作为变量命名?

3

我是SQL的新手,需要一些帮助。我正在尝试使用变量作为列标题,并迭代总和到某个可变范围内。以下是代码。

DECLARE @startmonth AS INT
DECLARE @endmonth AS INT
DECLARE @earnedpremiumyear AS INT
SET @startmonth = 200501
SET @endmonth = 200512
SET @earnedpremiumyear = 2005

WHILE @startmonth <= 201301
BEGIN
    SELECT SUM(earnedpremium) AS @earnedpremiumyear
    FROM dbo.Database
    WHERE accountingmonth BETWEEN @startmonth AND @endmonth
    AND earnedendingmonth BETWEEN @startmonth AND @endmonth
    SET @startmonth = @startmonth + 100
    SET @endmonth = @endmonth + 100
    SET @earnedpremiumyear = @earnedpremiumyear + 1
END

我希望SUM的标题是从2005年开始到2013年的已赚保费年份。当我运行这段代码时,我会得到以下错误信息:“Incorrect syntax near '@earnedpremiumyear'”,所以我肯定调用变量的方式有误。有人能帮忙吗?
另外,如何使总和不是为每个年份创建一个表格,而是在一个表格的一列或一行中呈现?
谢谢!

首先,感谢您提供了详细的问题描述和示例代码。这些让我们看到了您的技能水平和目标。其次,根据您的要求创建动态列名通常不是一个好主意,它削弱了关系数据库的一些最大优势,同时使将输出结果输入到表格或其他系统变得非常困难。更好的方法是在第二个名为“年份”的列中进行计算。我推荐采用AHiggins的建议。 - PowerUser
3个回答

4

你能试着将它简化为以下内容吗?

SELECT 
    LEFT(CAST(AccountingMonth AS VARCHAR(4)),4) AS AccountingYear,
    SUM(EarnedPremium) AS TotalEarnedPremium
FROM Database.dbo.Table 
WHERE 
    AccountingMonth BETWEEN 200501 AND 201301 AND 
    EarnedEndingMonth BETWEEN 200501 AND 201301 
GROUP BY LEFT(CAST(AccountingMonth AS VARCHAR(4)),4) 

哦,我的天啊,你真是个天才。我上周刚开始在工作中使用SQL,所以我还不太了解很多语法和其他东西,比如我以前从未使用过CAST。结果就像我在脑海中想象的一样。而且你用了更简单的方式实现了它。我还不太确定它是如何工作的,但我会仔细分析它,并希望能学习到它是如何实现的。谢谢! - blubr
非常高兴能够帮忙!有一些关于像GROUP BY这样的好教程可以在网上找到,我希望你能够从中受益! - AHiggins

0

我能想到的唯一方法是通过编写动态SQL查询:

DECLARE @startmonth AS INT
DECLARE @endmonth AS INT
DECLARE @earnedpremiumyear AS INT
SET @startmonth = 200501
SET @endmonth = 200512
SET @earnedpremiumyear = 2005
DECLARE @sql VARCHAR(MAX) = '';


WHILE @startmonth <= 201301
    BEGIN
    SELECT @sql = 'SUM(earnedpremium) AS ' + @earnedpremiumyear
    + 'FROM dbo.Database
    WHERE accountingmonth BETWEEN' + @startmonth + ' AND ' + @endmonth
    ...
    EXEC(@sql)
END

虽然那可能会变得相当丑陋。


0

类似这样的东西...

DECLARE @f   VARCHAR(10)='fff',
        @sql NVARCHAR(max)

SET @sql ='select 1 as ' + @f 

EXEC Sp_executesql
  @sql 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接