【问题标题】:Need help on PIVOT with NULL value需要关于 NULL 值的 PIVOT 帮助
【发布时间】:2015-01-28 03:40:15
【问题描述】:

我有这个数据集,并想做一个数据透视。

数据

Series_Name         Rec_Id  Series_Value    Point_Color
Hs avg CVD1 P1A     420     8810            NULL
Hs avg CVD1 P1B     420     8850.5          NULL
Hs avg CVD1 P2A     420     8793.5          R
Hs avg CVD1 P2B     420     8806.5          R

预期结果。

 Rec_Id Point_Color Hs avg CVD1 P1A     Hs avg CVD1 P1B     Hs avg CVD1 P2A     Hs avg CVD1 P2B
 420    R           8810                8850.5              8793.5              8806.5

但是此刻,从我的尝试来看,这是我得到的结果,我猜是 Point_Color 列上的 NULL 和 'R' 值导致了它。请告知如何获得预期的结果?

我得到的当前结果

Rec_Id  Point_Color Hs avg CVD1 P1A     Hs avg CVD1 P1B     Hs avg CVD1 P2A     Hs avg CVD1 P2B
420     NULL        8810                8850.5              NULL                NULL
420     R           NULL                NULL                8793.5              8806.5

提前致谢。

【问题讨论】:

  • 显示您使用的查询。

标签: sql-server pivot


【解决方案1】:

使用此查询获得所需的结果。

SELECT Rec_Id,
      SUM([Hs avg CVD1 P1A]) AS [Hs avg CVD1 P1A], 
      SUM([Hs avg CVD1 P1B]) AS [Hs avg CVD1 P1B], 
      SUM([Hs avg CVD1 P2A]) AS [Hs avg CVD1 P2A], 
      SUM([Hs avg CVD1 P2b]) AS [Hs avg CVD1 P2b], 
      MAX(Point_Color) AS Point_Color
FROm #Test 
PIVOT(SUM(Series_Value) FOR Series_Name IN (
                                            [Hs avg CVD1 P1A], 
                                            [Hs avg CVD1 P1B], 
                                            [Hs avg CVD1 P2A], 
                                            [Hs avg CVD1 P2b]
                                            )
    ) AS P 
GROUP BY Rec_Id

【讨论】:

    【解决方案2】:

    示例表

    SELECT * INTO #TEMP
    FROM
    (
        SELECT 'Hs avg CVD1 P1A' Series_Name,      420 Rec_Id,     8810  Series_Value,           NULL Point_Color
        UNION ALL
        SELECT 'Hs avg CVD1 P1B',     420,     8850.5,          NULL
        UNION ALL
        SELECT 'Hs avg CVD1 P2A',     420,     8793.5,          'R'
        UNION ALL
        SELECT 'Hs avg CVD1 P2B',     420,     8806.5,          'R'
    )TAB
    

    由于您将 Point_Color 分组到 pivot 中,它将分别处理 NULLR。为了避免NULLR 分组,您需要将NULL 替换为R 以获得预期结果。

    (1) 静态旋转。

    SELECT Rec_Id, Point_Color,
    MIN(CASE WHEN Series_Name='Hs avg CVD1 P1A' THEN  Series_Value END) [Hs avg CVD1 P1A],
    MIN(CASE WHEN Series_Name='Hs avg CVD1 P1B' THEN  Series_Value END) [Hs avg CVD1 P1B],
    MIN(CASE WHEN Series_Name='Hs avg CVD1 P2A' THEN  Series_Value END) [Hs avg CVD1 P2A],
    MIN(CASE WHEN Series_Name='Hs avg CVD1 P2A' THEN  Series_Value END) [Hs avg CVD1 P2B]
    FROM
    (
        SELECT Rec_Id,ISNULL(Point_Color,'R') Point_Color,Series_Name,Series_Value  
        FROM #TEMP
    )TAB
    GROUP BY Rec_Id,Point_Color
    

    (2) 动态旋转

    如果Series_Name中的值事先是未知的,你可以使用动态枢轴。

    获取数据透视的列。

    DECLARE @cols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + Series_Name + ']', '[' + Series_Name + ']')
                   FROM    (SELECT DISTINCT Series_Name FROM #TEMP) PV 
                   ORDER BY Series_Name
    

    现在旋转它。

    DECLARE @query NVARCHAR(MAX)
    SET @query = 'SELECT * FROM 
                 (
                     SELECT Series_Name,Rec_Id,Series_Value ,ISNULL(Point_Color,''R'') Point_Color  
                     FROM #TEMP
                 ) x
                 PIVOT 
                 (
                     MIN(Series_Value)
                     FOR Series_Name IN (' + @cols + ')
                ) p
                ORDER BY Rec_Id;' 
    
    EXEC SP_EXECUTESQL @query
    

    结果

    【讨论】:

    • 这是您期待的结果吗? @瑞安
    猜你喜欢
    • 2014-03-11
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多