2014-10-20 3 views
3

новый для SQL и нужна помощь. Я пытаюсь использовать переменную в качестве заголовка столбца и перебирать суммы по определенному диапазону, который изменяется. Вот код ниже.Как классифицировать столбцы как переменную в 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 

Я хочу, чтобы это так, чтобы название суммы заработанной премии год, начиная с 2005 года и собираюсь до 2013 года Когда я запускаю этот код, я получаю эту ошибку:

Incorrect syntax near '@earnedpremiumyear'

поэтому я определенно называю переменную неправильной. Может ли кто-нибудь помочь?

Кроме того, как мне сделать так, чтобы вместо создания таблицы для каждого года сумма составляла всего одну таблицу в одном столбце или строке?

Спасибо!

+0

Во-первых, +1 за подробный вопрос и примеры кода. Благодаря этому мы можем видеть ваши общие навыки и цели. Во-вторых, создание динамических имен для столбцов, как вы просите, обычно не является хорошей идеей и поражает некоторые из лучших преимуществ реляционной базы данных. Слишком сложно подавать вывод в таблицы или другие системы. Лучший подход - сделать второй столбец под названием «год» и рассчитать свой год там. Я рекомендую предложение Ахиггинса ниже. – PowerUser

ответ

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) 
+0

О, Боже мой, ты гений. Я буквально начал использовать SQL на моей работе на прошлой неделе, поэтому я до сих пор не знаю много синтаксиса и т. Д., Например, я никогда раньше не использовал CAST. Результат - это буквально то, что я себе представлял в голове. И вы сделали это проще. Я не совсем уверен, как это работает, но я буду разбирать его и, надеюсь, узнаю, как он это сделал. Спасибо! – blubr

+0

Очень рад помочь! Есть некоторые [хорошие учебники по таким вещам, как GROUP BY] (http://www.w3schools.com/sql/sql_groupby.asp), и я надеюсь, что вы сможете найти их полезными! – 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 
Смежные вопросы