2016-11-09 39 views
1

如何将以下查询的输出重命名(别名)默认状态(例如:QLD为Quensland)? 另外我怎样才能将国家的预测汇总(SUM)到更高的水平(例如:国家)?UNPIVOT上的聚合和别名

SELECT PRODUCT_BK, Month, State, Forecast 
FROM 
(SELECT * FROM Forecast_Table) t 
UNPIVOT 
(Forecast FOR State IN (SA_NT, QLD, VIC_TAS, WA, NSW_ACT)) AS fcst 

谢谢

这是一个跟进this question

+0

你想要什么实际的聚合?你能展示预期的产出吗? –

+0

想通了自己,谢谢你的时间堆积 – OZRiz

回答

2

您可以使用case用于上述目的

SELECT PRODUCT_BK, 
     MONTH, 
     CASE [State] WHEN 'QLD' THEN 'Quensland' 
        WHEN 'SA_NT' THEN 'something else' 
        ELSE [State] 
     END AS [State], 
     Forecast 
FROM (SELECT * FROM Forecast_Table) t 
UNPIVOT (Forecast FOR State IN (SA_NT, QLD, VIC_TAS, WA, NSW_ACT)) AS fcst 

,或者作为替代方式,您可以创建#temp_table或在你的数据库@variable_table或表格,填写此表与旧&新名称,并加入最终的输出与此表。

例如:

-- create variable table to store reference between old and new alias 
DECLARE @Sometable AS TABLE 
    (
     OldName NVARCHAR(10) , 
     ShouldBeName NVARCHAR(20) 
    ) 
INSERT @Sometable 
     (OldName, ShouldBeName) 
VALUES ('SA_NT', 'Some Name 1'), 
     ('QLD', 'Some Name 2'), 
     ('VIC_TAS', 'Some Name 3'); 

--final query 
SELECT fcst.PRODUCT_BK , 
     fcst.Month , 
     COALESCE(S.ShouldBeName, fcst.[State]) AS [State] , 
     fcst.Forecast 
FROM (SELECT * FROM Forecast_Table) t 
     UNPIVOT (Forecast FOR State IN (SA_NT, QLD, VIC_TAS, WA, NSW_ACT)) AS fcst 
     LEFT JOIN @Sometable AS S ON fcst.[State] = S.OldName 

或者是,即使是这样的:

SELECT fcst.PRODUCT_BK , 
     fcst.Month , 
     COALESCE(S.ShouldBeName, fcst.[State]) AS [State] , 
     fcst.Forecast 
FROM (SELECT * FROM Forecast_Table) t 
     UNPIVOT (Forecast FOR State IN (SA_NT, QLD, VIC_TAS, WA, NSW_ACT)) AS fcst 
     LEFT JOIN (SELECT * 
        FROM (VALUES ('SA_NT', 'Some Name 1'), 
            ('QLD', 'Some Name 2'), 
            ('VIC_TAS', 'Some Name 3') 
          ) AS S (OldName, ShouldBeName) 
        ) AS S ON fcst.[State] = S.OldName 
+0

感谢瓦西里,第一个选项工作很好,很容易。我也计划在国家层面汇总预测。你的努力非常感谢。 – OZRiz