【问题标题】:12 month rolling from a entered month?从输入的月份开始滚动 12 个月?
【发布时间】:2017-03-31 11:51:49
【问题描述】:

您好,有人可以帮帮我吗,我想创建一个带有月份参数的脚本,我需要的结果是接下来 12 个月的名称作为列标题。

例如,如果参数是二月,结果应该是:

March | April | May | June | July | August | September | October | November | December | January | February |

作为我想在稍后阶段用来填充值的列名。 有人可以就这一点给我建议以及如何实现这一点

到目前为止,我的脚本不知道如何处理这个

declare @MonthParam varchar(20) = 'March'
declare @MonthNumber int = (
Select CASE WHEN @MonthParam = 'January' THEN 1
            WHEN @MonthParam = 'February' THEN 2
            WHEN @MonthParam = 'March' THEN 3
            WHEN @MonthParam = 'April' THEN 4
            WHEN @MonthParam = 'May' THEN 5
            WHEN @MonthParam = 'June' THEN 6
            WHEN @MonthParam = 'July' THEN 7
            WHEN @MonthParam = 'August' THEN 8
            WHEN @MonthParam = 'September' THEN 9
            WHEN @MonthParam = 'October' THEN 10
            WHEN @MonthParam = 'November' THEN 11
            WHEN @MonthParam = 'December' THEN 12
END) 
WHILE(@MonthNumber < 13)

    BEGIN

    declare @month varchar(20) = DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )
    declare @sql varchar(max)
    set @sql = 'select val as ' + @month + ' from t'
    exec (@sql)

    SET @MonthNumber = @MonthNumber + 1;

    END

【问题讨论】:

  • 您使用的是哪个 dbms?您尝试了什么 - 向我们展示您当前的查询尝试。
  • 我正在使用 sql 2008 R2,到目前为止我有以下脚本,但我希望它在一个结果集中
  • I have the following script... 脚本在哪里?
  • 我将添加我的脚本作为答案,它太大了
  • 不!将其添加到您的问题中。

标签: sql sql-server sql-server-2008-r2 pivot


【解决方案1】:

否则,您可以使用“简化”方法。

declare @MonthParam varchar(20) = 'March'
declare @Dte date = CAST(concat(@MonthParam, ' 01 1900') AS DATE)
declare @sql varchar(max) = concat('select null as ', DATENAME(MONTH, DATEADD(MONTH, 1, @Dte)),
                    ', null as ', DATENAME(MONTH, DATEADD(MONTH, 2, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 3, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 4, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 5, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 6, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 7, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 8, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 9, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 10, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 11, @Dte)),
                    ',null as ',DATENAME(MONTH, DATEADD(MONTH, 12, @Dte))) 
 exec (@sql)

【讨论】:

  • 谢谢这正是我所需要的!
  • @LeeRoy 很高兴它有帮助。如果它是您选择的选项,您可以将其标记为答案。
【解决方案2】:
declare @date_entered varchar(50) = 'February'
set @date_entered = @date_entered + ' 01 ' + CONVERT(char(4),year(getdate()))
declare @start_month datetime = @date_entered
declare @loop_month datetime = @start_month

declare @sql nvarchar(max)

set @sql = 'CREATE TABLE MyDates ('

WHILE @loop_month < DATEADD(year,1,@start_month)
BEGIN
    set @sql += DATENAME(month,@loop_month) + ' varchar(100),'
    set @loop_month = DATEADD(month,1,@loop_month)
END

-- Get rid of the comma at the end of the string and close the table paranthesis (edit was to the following bit)
set @sql = LEFT(@sql,len(@sql)-1) + ')'

print @sql
--Uncomment below to run
--exec(@sql)

【讨论】:

  • 最后的set @sql += 应该只是set @sql =。我已经进行了编辑,但在经过同行评审之前,它不会出现在 @ElementZero 的答案中。
  • 啊,谢谢史蒂夫。当我添加 LEFT 时,我忘了删除那个 +。 :)
  • 谢谢你们!这看起来可能有效,我会测试并让你知道。感谢零元素 Steve Lovell 的支持!
【解决方案3】:

我使用了一个带有一些虚拟数据的临时表来将最终输出显示为一个表格

DECLARE @PivotColumnHeaders VARCHAR(MAX);
DECLARE @date_entered varchar(50) = 'February';
SET @date_entered = @date_entered + ' 01 ' + CONVERT(CHAR(4),YEAR(GETDATE()));
DECLARE @s INT= 1, @e INT = 12;
CREATE TABLE PivotTemp (Dummy INT, [MonthName] VARCHAR(15));

WHILE ( @s <= @e)
BEGIN
    SELECT @PivotColumnHeaders =
    COALESCE(
        @PivotColumnHeaders + ',[' + DATENAME(MONTH,DATEADD(MONTH, @s, @date_entered)) + ']',
        '[' + DATENAME(MONTH,DATEADD(MONTH, @s, @date_entered))+ ']'
    );
    INSERT INTO PivotTemp ( Dummy, [MonthName] )  VALUES ( @s, DATENAME(MONTH,DATEADD(MONTH, @s, @date_entered)) );
    SET @s = @s + 1;
END;
--SELECT @PivotColumnHeaders ; 
--SELECT * FROM PivotTemp ;

DECLARE @PivotTableSQL NVARCHAR(MAX);
SET @PivotTableSQL = N'
  SELECT *
  FROM (
    SELECT
      H.Dummy [DummyValue],
      H.[MonthName] [MonthName]
    FROM dbo.PivotTemp H
  ) AS PivotData
  PIVOT (
    MAX(DummyValue)
    FOR [MonthName] IN (
      ' + @PivotColumnHeaders + '
    )
  ) AS PivotTable
';

EXECUTE(@PivotTableSQL);
DROP TABLE PivotTemp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2019-01-04
    • 1970-01-01
    • 2019-08-18
    • 2013-10-06
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多