【问题标题】:How do I combine two columns into single column in dynamic pivot如何在动态枢轴中将两列组合成单列
【发布时间】:2015-02-08 07:49:49
【问题描述】:

我有这样的架构

demo(id, val, month, year, decide)

演示数据和架构在这个小提琴http://sqlfiddle.com/#!3/dd89d5/1中给出

在输出中,我想将行转换为列。 在我想要的输出中,

ID    (11 14)  (12 14) (2 15) ...     decider
101    0.45     0.5      0.3          411
102    0.4      0.2      0.1          411

我想要对月份、年份进行排序

我经历了很多线程并找到了一个小提琴。并尝试定制以满足我的需要

这是我尝试过的http://sqlfiddle.com/#!3/dd89d5/1

但无法获得解决方案。请帮帮我

【问题讨论】:

    标签: sql-server sql-server-2008 pivot crosstab dynamic-pivot


    【解决方案1】:

    这是你的桌子

    create table demo(
        id varchar(max),    val decimal(4,2),    month int,    year int, decider int
      )
    
    INSERT INTO demo
        ([id], [val], [month], [year], [decider])
    VALUES
    
    (101, 0.25, 11, 14, 411),
    (101, 1, 12, 14, 411),
    (101, 0.5, 1, 15, 411),
    (101, 0.75, 2, 15, 411),
    (102, 0.25, 11, 14, 411),
    (102, 0.5, 12, 14, 411),
    (102, 0.25, 1, 15, 411),
    (101, 0.75, 11, 14, 412),
    (101, 0.5, 1, 15, 412),
    (101, 0.25, 2, 15, 412),
    (102, 0.5, 11, 14, 412),
    (102, 0.5, 12, 14, 412),
    (103, 0.25, 1, 15, 412),
    (103, 0.5, 11, 14, 411)
    ;
    

    使用Dense_Rank 为枢轴排序列

    SELECT DENSE_RANK() OVER(ORDER BY [YEAR] ,[MONTH]) RNO,*,CAST([MONTH] AS VARCHAR) + ' ' +  CAST([YEAR] AS VARCHAR) DT
    INTO #TEMP
    FROM
    (
        SELECT ID,SUM(VAL)VAL,[MONTH],[YEAR],DECIDER
        FROM DEMO 
        GROUP BY ID,[MONTH],[YEAR],DECIDER
    )TAB
    

    选择数据透视的列并声明一个变量以将NULL 替换为零

    DECLARE @cols NVARCHAR (MAX)
    DECLARE @NullToZeroCols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + DT + ']', 
                  '[' + DT + ']')
                   FROM    (SELECT DISTINCT RNO,DT FROM #TEMP) PV  
                   ORDER BY RNO
    
    SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+DT+'],0) AS ['+DT+']' 
    FROM(SELECT DISTINCT DT,RNO FROM #TEMP GROUP BY DT,RNO)TAB  
    ORDER BY RNO  FOR XML PATH('')),2,8000)
    

    现在旋转它

    DECLARE @query NVARCHAR(MAX)
    SET @query = 'SELECT P.ID,' + @NullToZeroCols + ',DECIDER FROM 
                 (
                     SELECT ID, DT, val,DECIDER FROM #TEMP
                 ) x
                 PIVOT 
                 (
                     SUM(val)
                     FOR DT IN (' + @cols + ')
                ) p
                ORDER BY ID;' 
    
    EXEC SP_EXECUTESQL @query
    

    结果

    这是 Fiddle http://sqlfiddle.com/#!3/95111/1(如果加载时出现任何错误,请按 RUNSQL)

    【讨论】:

    • 有没有办法将那些空值替换为 0?
    • 根据您的更新@sanjay,我已经添加了将 NULL 替换为零的代码
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多