【问题标题】:How do I title columns as a variable in SQL?如何在 SQL 中将列命名为变量?
【发布时间】:2014-10-21 04:57:27
【问题描述】:

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 年。运行此代码时,我收到此错误:

“@earnedpremiumyear”附近的语法不正确

所以我肯定是错误地调用了变量。有人可以帮忙吗?

另外,我该如何做到这一点,而不是为每年的总计创建一个表格,而总和都在一个表格的一列或一行中?

谢谢!

【问题讨论】:

  • 首先,为您的详细问题和示例代码 +1。多亏了这一点,我们才能看到您的一般技能水平和目标。其次,按照您的要求为列创建动态名称通常不是一个好主意,并且会破坏关系数据库的一些最佳优势。将输出输入表格或其他系统变得非常困难。更好的方法是制作一个名为“年份”的第二列并在那里计算你的年份。我在下面推荐 AHiggins 的建议。

标签: sql-server tsql


【解决方案1】:

您可以尝试将其简化为以下内容吗?

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 一样。结果确实是我在脑海中想象的。而且你以更简单的方式做到了。我不太确定它是如何工作的,但我会剖析它并希望了解它是如何做到的。谢谢!
  • 非常乐意提供帮助!那里有一些good tutorials on things like GROUP BY,希望对您有所帮助!
【解决方案2】:

我能想到的唯一方法是编写动态 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

不过这可能会变得很丑。

【讨论】:

    【解决方案3】:

    有些东西可以解决这个问题..

    DECLARE @f   VARCHAR(10)='fff',
            @sql NVARCHAR(max)
    
    SET @sql ='select 1 as ' + @f 
    
    EXEC Sp_executesql
      @sql 
    

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2016-01-08
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多