2017-09-27 84 views
0

這是我的表:垂直於SQL Server數據的水平視圖2008

schedid  Name  isPresent  Date 
------------------------------------------- 
1   James Yes   9/2/2017 
2   James Yes   9/3/2017 
3   James Yes   9/4/2017 
4   Rob  Yes   9/2/2017 
5   Rob  Yes   9/4/2017 

我想是這樣顯示的:

Name  9/2/2017  9/3/2017  9/4/2017 
-------------------------------------------- 
James  Yes   Yes   Yes 
Rob  Yes      Yes 

我應該使用什麼查詢?請幫助我..

+1

[這](https://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server)可能是你在找什麼。 – dotNET

+1

Google sql server主鍵。這個案例有很多例子。 – scsimon

回答

0

我使用透視功能做到了。

;With PivotData 
As 
(
    Select 
     Name, -- grouping element 
     [Date], -- spreading element 
     IsPresent -- aggregating element 
    From MyTable 
) 
Select Name, [2017-09-02], [2017-09-03], [2017-09-04] 
From PivotData 
Pivot (Max(IsPresent) For [Date] In ([2017-09-02], [2017-09-03], [2017-09-04])) As P; 

希望這是有益:)

編輯:我做了這個查詢的動態之一。試試看,讓我知道。

DECLARE @query VARCHAR(4000) 
    ,@Dates VARCHAR(4000) 

SET @Dates = STUFF((
      SELECT DISTINCT '],[' + Cast([Date] As Varchar) 
      FROM MyTable 
      ORDER BY '],[' + Cast([Date] As Varchar) 
      FOR XML PATH('') 
      ), 1, 2, '') + ']' 

SET @query = ' 
;With PivotData 
As 
(
    Select 
     Name, -- grouping element 
     [Date], -- spreading element 
     IsPresent-- aggregating element 
    From MyTable 
) 
Select * 
From PivotData 
Pivot (Max(IsPresent) For [Date] In (' + @Dates + ')) As P;' 

EXEC (@query); 
+0

我該如何動態地做到這一點? – redbull

+0

我讓它變得動感十足。現在試試吧。 –

+0

謝謝,它工作.. – redbull

0

「手動編碼」版本看起來類似於以下內容...如果需要動態版本,那麼也很容易。

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    schedid INT, 
    Name VARCHAR(10), 
    isPresent CHAR(3), 
    [Date] date 
    ); 
INSERT #TestData (schedid, Name, isPresent, Date) VALUES 
    (1, 'James', 'Yes', '9/2/2017'), 
    (2, 'James', 'Yes', '9/3/2017'), 
    (3, 'James', 'Yes', '9/4/2017'), 
    (4, 'Rob ', 'Yes', '9/2/2017'), 
    (5, 'Rob ', 'Yes', '9/4/2017'); 

--================================================== 

SELECT 
    td.Name, 
    [2017-09-02] = MAX(CASE WHEN td.[Date] = '2017-09-02' THEN td.isPresent ELSE '' END), 
    [2017-09-03] = MAX(CASE WHEN td.[Date] = '2017-09-03' THEN td.isPresent ELSE '' END), 
    [2017-09-04] = MAX(CASE WHEN td.[Date] = '2017-09-04' THEN td.isPresent ELSE '' END) 
FROM 
    #TestData td 
GROUP BY 
    td.Name; 

結果...

Name  2017-09-02 2017-09-03 2017-09-04 
---------- ---------- ---------- ---------- 
James  Yes  Yes  Yes 
Rob  Yes     Yes 
+0

我該如何動態地做到這一點? – redbull