2013-09-30 70 views
-2

我有一個SQL數據庫上執行下面的數據集動態字段內容爲行的Sql

---------------------------------- 
| ID | NAME | AGE | STATUS | 
----------------------------------- 
| 1ASDF | Brenda | 21 | Single | 
----------------------------------- 
| 2FDSH | Ging | 24 | Married| 
----------------------------------- 
| 3SDFD | Judie | 18 | Widow | 
----------------------------------- 
| 4GWWX | Sophie | 21 | Married| 
----------------------------------- 
| 5JDSI | Mylene | 24 | Singe | 
----------------------------------- 

我要查詢該數據集,這樣我可以在我的結果

-------------------------------------- 
| AGE | SINGLE | MARRIED | WIDOW | 
-------------------------------------- 
| 21 | 1  | 1  | 0  | 
-------------------------------------- 
| 24 | 1  | 1  | 0  | 
-------------------------------------- 
| 18 | 0  | 0  | 1  | 
-------------------------------------- 

而且具有這種結構狀態列可以是動態的,所以會有更多列來。 這可能嗎?

+1

從概念上說,您需要一個透視狀態列,按年齡分組 – LittleSweetSeas

回答

1

由於您使用的是SQL Server,您可以使用PIVOT表操作是這樣的:

SELECT * 
FROM 
(
    SELECT Age, Name, Status FROM tablename 
) AS t 
PIVOT 
(
    COUNT(Name) 
    FOR Status IN(Single, Married, Widow) 
) AS p; 

SQL Fiddle Demo


要做到這一點動態,你必須使用動態SQL這樣的:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 


select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(status) 
         FROM tablename 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = ' 
SELECT * 
FROM 
(
    SELECT Age, Name, Status FROM tablename 
) AS t 
PIVOT 
(
    COUNT(Name) 
    FOR Status IN(' [email protected] + ') 
) AS p;'; 


execute(@query); 
+0

Tnx Mahmoud!我測試了你的兩個答案,但唯一的第一個查詢運行良好。後來我決定使用mssql服務器管理工​​作室來測試這些查詢,並且都完美地工作。那時我正在使用navicat。我想知道navicat有什麼問題。無論如何,這幫助了我很多。獎勵! – PunctuationMark