2015-11-04 57 views
-2

请我需要一些真正的帮助。我有下面的表格。我已经在Temp表中创建了它,如下所示。转置一些SQL Server表列

--drop table ##DerivedTBL 
CREATE TABLE ##DerivedTBL (M_NO INT, Location VARCHAR(20),SetTarget MONEY,TMonth VARCHAR(20) 
      ,TargetAchieved Money ,Total INT) 

INSERT INTO ##DerivedTBL VALUES ('1', 'BRS', '0.7', 'Apr-15', '0.60465116279', '86') 
INSERT INTO ##DerivedTBL VALUES ('1', 'WES', '0.7', 'Apr-15', '1', '6') 
INSERT INTO ##DerivedTBL VALUES ('2', 'WES', '0.7', 'May-15', '0.5', '4') 
INSERT INTO ##DerivedTBL VALUES ('2', 'BRS', '0.7', 'May-15', '0.595238095238', '84') 
INSERT INTO ##DerivedTBL VALUES ('3', 'BRS', '0.7', 'Jun-15', '0.56862745098', '102') 
INSERT INTO ##DerivedTBL VALUES ('3', 'WES', '0.7', 'Jun-15', '1', '9') 
INSERT INTO ##DerivedTBL VALUES ('4', 'WES', '0.7', 'Jul-15', '0.666666666666', '15') 
INSERT INTO ##DerivedTBL VALUES ('4', 'BRS', '0.7', 'Jul-15', '0.615384615384', '78') 
INSERT INTO ##DerivedTBL VALUES ('5', 'BRS', '0.7', 'Aug-15', '0.47193877551', '392') 
INSERT INTO ##DerivedTBL VALUES ('5', 'WES', '0.7', 'Aug-15', '0.4375', '16') 
INSERT INTO ##DerivedTBL VALUES ('6', 'BRS', '0.7', 'Sep-15', '0.452830188679', '583') 
INSERT INTO ##DerivedTBL VALUES ('6', 'WES', '0.7', 'Sep-15', '0.714285714285', '14') 
INSERT INTO ##DerivedTBL VALUES ('7', 'BRS', '0.7', 'Oct-15', '0.475285171102', '526') 
INSERT INTO ##DerivedTBL VALUES ('7', 'WES', '0.7', 'Oct-15', '0.5', '2') 
INSERT INTO ##DerivedTBL VALUES ('8', 'BRS', '0.7', 'Nov-15', '1', '1')        


select * from ##DerivedTBL  

我想达到什么是转置(TMonth,TargetAchieved,合计)colums,这样的结果会看起来像一个波纹管。 非常感谢提前

M_NO Target MonthYear1 MonthYear2 Total1 Total2 
1 0.7 Apr-15 Apr-15 6 86 
2 0.7 May-15 May-15 44 4 
3 0.7 Jun-15 Jun-15 9 102 
4 0.7 Jul-15 Jul-15 78 15 
5 0.7 Aug-15 Aug-15 16 392 
+1

你认为我们应该手动猜测你做了什么吗? –

+2

这是查询的交叉表或透视类型。它已经在这个网站和互联网的其他地方回答了数千次。 –

回答

1

如果每行有两个位置,那么你可以使用CASE表达式行转换成列,否则,你可以使用UNPIVOT运营商与排名功能,然后使用CASE表达式行转换为这样的列:

WITH Unpivoted 
AS 
(
    SELECT M_NO, TargetAchieved, col, val, rn 
    FROM 
    (
     SELECT 
      M_NO, 
      CAST(TMonth AS NVARCHAR(50)) AS TMonth, 
      CAST(Total AS NVARCHAR(50)) AS Total, 
      TargetAchieved, 
      ROW_NUMBER() OVER(PARTITION BY M_NO ORDER BY location) AS RN 
     FROM DerivedTBL 
    ) AS t 
    UNPIVOT 
    (
     val 
     FOR col IN(Total, TMonth) 
    ) AS p 
) 
SELECT 
    M_NO, 
    MAX(TargetAchieved) AS TargetAchieved, 
    MAX(CASE WHEN col = 'TMonth' AND rn = 1 THEN val END) AS MonthYear1, 
    MAX(CASE WHEN col = 'TMonth' AND rn = 2 THEN val END) AS MonthYear2, 
    MAX(CASE WHEN col = 'Total' AND rn = 1 THEN val END) AS Total1, 
    MAX(CASE WHEN col = 'Total' AND rn = 2 THEN val END) AS Total2 
FROM Unpivoted AS u 
GROUP BY M_NO; 

这会给你这样的事情:

enter image description here

1

喜欢这个?

select A.M_NO, A.SetTarget, A.TMonth MonthYear1, B.TMonth MonthYear2, A.Total Total1, B.Total Total2 
    from ##DerivedTBL A 
    INNER JOIN ##DerivedTBL B ON A.M_NO = B.M_NO 
     AND A.Location ='WES' AND B.Location = 'BRS'