2017-06-19 48 views
0

这是我第一次尝试旋转表格。我设法只用一种措施来摆动桌子,并没有用多种措施来做到这一点。请问我能得到一些建议吗?以下是我拥有的测试数据,我希望看到。请注意,我有大约20到30个措施。tsql:使用多种方法旋转表格

提前致谢!

-- Test Data HAVE 
CREATE TABLE #have 
(Name VARCHAR(50),Subject Varchar(20), Marks1 INT,Marks2 INT, Result Varchar(20)) 
GO 

INSERT INTO #have VALUES('Jsmith','Maths',65,56,'Pass') 
INSERT INTO #have VALUES('Jsmith','Science',42,72,'Failed') 
GO 

-- Test Data WANT 
CREATE TABLE #want 
(Name VARCHAR(50),Maths_Marks1 INT ,Maths_Marks2 INT,Science_Marks1 INT,Science_Marks2 INT, Maths_Result Varchar(20), Science_Result Varchar(20)) 
GO 

INSERT INTO #want VALUES('Jsmith',65,56,42,72,'Pass','Failed') 
GO 

select * from #have 
select * from #want 


-- Pivot table 

SELECT Name , [Maths] AS [Maths_Marks1], [Science] AS [Science_Marks1] 
FROM 
(SELECT Name, Subject, Marks1 FROM #have) as SourceTable 
PIVOT 
(SUM(Marks1) 
FOR Subject in ([Maths],[Science]) 
) as PivotTable1 

-- Also Tried..Unable to get it working 
    SELECT Name , [Maths] AS [Maths_Marks1], [Science] AS [Science_Marks1] 
FROM 
(SELECT Name, Subject, Marks1 FROM #have) as SourceTable 
PIVOT 
(SUM(Marks1) 
FOR Subject in ([Maths]) 
) as PivotTable1 
(SELECT Name, Subject, Marks2 FROM #have) as SourceTable 
PIVOT 
(SUM(Marks2) 
FOR Subject in ([Science]) 
) as PivotTable2 
+0

编辑你的问题,并提供样本数据和预期的结果。 –

回答

0

这招建立在商标性质:它们是整数,标记< 1000,恰好2马克列(标志1,Marks2)是在表中。

CREATE TABLE #have 
(Name VARCHAR(50),Subject Varchar(20), Marks1 INT,Marks2 INT) 


INSERT INTO #have VALUES('Jsmith','Maths',65,56) 
INSERT INTO #have VALUES('Jsmith','Science',42,72) 

SELECT Name, [Maths]/1000 AS [Maths_Marks1], [Maths]%1000 AS [Maths_Marks2], [Science]/1000 AS [Science_Marks1], [Science]%1000 AS [Science_Marks2] 
FROM (SELECT Name, Subject, 1000*Marks1 + Marks2 Marks FROM #have) t 
PIVOT (SUM(Marks)FOR Subject in ([Maths],[Science])) as p1 

否则,一般做有条件聚集

SELECT Name 
    , max(case Subject when 'Maths' then Marks1 end) AS [Maths_Marks1] 
    , max(case Subject when 'Maths' then Marks2 end) AS [Maths_Marks2] 
    , max(case Subject when 'Maths' then Result end) AS [Maths_Result] 
    , max(case Subject when 'Science' then Marks1 end) AS [Science_Marks1] 
    , max(case Subject when 'Science' then Marks2 end) AS [Science_Marks2] 
    , max(case Subject when 'Science' then Result end) AS [Science_Result] 
FROM #have 
GROUP BY name 
+0

嗨Serg,道歉。我应该让这个更清楚。这适用于整数列根据我的初始职位,但我的要求是不同的。我已经对我的文章进行了更改,请现在检查#have和#want表格。无论如何感谢您的回答。 – ichange

+0

查看更多常规解决方案的编辑答案。 – Serg

0

您可以通过如下支点尝试:

Select [Name], Max(Maths_Marks1) as Maths_Marks1, Max(Maths_Marks2) as Maths_Marks2, max([Science_Marks1]) as [Science_Marks1] 
      ,max([Science_Marks2]) as [Science_Marks2], max([Maths_Result]) as [Maths_Result], max([Science_Result]) as [Science_Result] 
    from (
    Select [Name], [Subject] + '_Marks1' as [Subject1], [Subject] +'_Marks2' as [Subject2], Marks1, Marks2, Result, [Subject] +'_Result' as [SubjectRes] from #have) a 
    pivot (max(marks1) for [Subject1] in ([Maths_Marks1],[Science_Marks1])) p 
    pivot (max(marks2) for [Subject2] in ([Maths_Marks2],[Science_Marks2])) p1 
    pivot (max(Result) for [SubjectRes] in ([Maths_Result],[Science_Result])) p2 
group by [Name] 
+0

嗨Kannan,道歉迟交回复。我会给这个测试运行并让你知道。谢谢 :) – ichange