2017-04-10 36 views
1

我有一個表的格式如下Sql Server的轉動命令基於文本給空細胞

╔════════╦══════════════╦════════╦════════════╦══════════╦════════╦══════════╦══════════╗ 
║ Answer ║ QuestionText ║ type ║ QuestionID ║ ResultID ║ Action ║ Username ║ SurveyID ║ 
╠════════╬══════════════╬════════╬════════════╬══════════╬════════╬══════════╬══════════╣ 
║ FN 1 ║ First Name ║ text ║ 3467  ║ 2259  ║ 2259 ║ admin ║ 308  ║ 
║ LN 1 ║ Last Name ║ text ║ 3468  ║ 2259  ║ 2259 ║ admin ║ 308  ║ 
║ Male ║ Gender  ║ radio ║ 3466  ║ 2259  ║ 2259 ║ admin ║ 308  ║ 
║ 12  ║ Age   ║ number ║ 3469  ║ 2259  ║ 2259 ║ admin ║ 308  ║ 
║ FN 2 ║ First Name ║ text ║ 3467  ║ 2260  ║ 2260 ║ admin ║ 308  ║ 
║ LN 2 ║ Last Name ║ text ║ 3468  ║ 2260  ║ 2260 ║ admin ║ 308  ║ 
║ Female ║ Gender  ║ radio ║ 3466  ║ 2260  ║ 2260 ║ admin ║ 308  ║ 
║ 12  ║ Age   ║ number ║ 3469  ║ 2260  ║ 2260 ║ admin ║ 308  ║ 
╚════════╩══════════════╩════════╩════════════╩══════════╩════════╩══════════╩══════════╝ 

我使用下面的支點查詢它試圖支點。

SELECT [ResultID],[Username],[Action],[First Name],[Last Name],[Gender],[Age] from 
      (
       select * 
       from #myTab 
      ) as y 
      pivot 
      (
       max(Answer) 
       for QuestionText in ([First Name],[Last Name],[Gender],[Age]) 
      ) as p 

但我得到下表爲支點結果

╔══════════╦══════════╦════════╦════════════╦═══════════╦════════╦══════╗ 
║ ResultID ║ Username ║ Action ║ First Name ║ Last Name ║ Gender ║ Age ║ 
╠══════════╬══════════╬════════╬════════════╬═══════════╬════════╬══════╣ 
║ 2259  ║ admin ║ 2259 ║ NULL  ║ NULL  ║ NULL ║ 12 ║ 
║ 2260  ║ admin ║ 2260 ║ NULL  ║ NULL  ║ NULL ║ 12 ║ 
║ 2259  ║ admin ║ 2259 ║ NULL  ║ NULL  ║ Male ║ NULL ║ 
║ 2260  ║ admin ║ 2260 ║ NULL  ║ NULL  ║ Female ║ NULL ║ 
║ 2259  ║ admin ║ 2259 ║ FN 1  ║ NULL  ║ NULL ║ NULL ║ 
║ 2260  ║ admin ║ 2260 ║ FN 2  ║ NULL  ║ NULL ║ NULL ║ 
║ 2259  ║ admin ║ 2259 ║ NULL  ║ LN 1  ║ NULL ║ NULL ║ 
║ 2260  ║ admin ║ 2260 ║ NULL  ║ LN 2  ║ NULL ║ NULL ║ 
╚══════════╩══════════╩════════╩════════════╩═══════════╩════════╩══════╝ 

我不知道爲什麼我收到所有這些NULL值。這將是一個很大的幫助,如果有人能告訴我這是爲什麼發生的,而正確的方式來獲得以下支點輸出:

╔══════════╦══════════╦════════╦════════════╦═══════════╦════════╦══════╗ 
║ ResultID ║ Username ║ Action ║ First Name ║ Last Name ║ Gender ║ Age ║ 
╠══════════╬══════════╬════════╬════════════╬═══════════╬════════╬══════╣ 
║ 2259  ║ admin ║ 2259 ║ FN 1  ║ LN 1  ║ Male ║ 12 ║ 
║ 2260  ║ admin ║ 2260 ║ FN 2  ║ LN 2  ║ Female ║ 12 ║ 
╚══════════╩══════════╩════════╩════════════╩═══════════╩════════╩══════╝ 

Source table in csv format

+0

唉唉,ASCII表...:d –

+0

您需要選擇只有你的子查詢所需的列。我更喜歡條件聚合到'pivot'語法。 –

回答

1

這是正常現象......你應該使用一組由一個聚合函數(如MAX()或第()或字符串連接(也許東西嗎?)根據您的要求),以減少的結果,每個實體單行(由鍵,你組上定義)

編輯:嘗試;

SELECT 
[ResultID], 
max([Username]) as Username, 
max([Action]) as action, 
max([First Name]) as FirstName, 
max([Last Name]) as LastName, 
max([Gender]) as gender, 
max([Age]) as age from 
      (
       select * 
       from #myTab 
      ) as y 
      pivot 
      (
       max(Answer) 
       for QuestionText in ([First Name],[Last Name],[Gender],[Age]) 
      ) as p 
GROUP BY 
    ResultId 
+0

我很想知道如何。因爲我對sql服務器和數據透視過程相當陌生。我沒有所需的詞彙來搜索並在計算器中找到它。如果您可以告訴我如何應用該羣組,或者可以將該問題標記爲重複。我會感激你 – insomniac

+0

@insomniac嘗試例如我編輯 – Milney

+0

謝謝你,這對我的作品,而所有其他的答案 – insomniac

2

只是限制要求X軸,Y軸(n)和值

Select [ResultID],[Username],[Action],[First Name],[Last Name],[Gender],[Age] 
From (
     Select resultid 
       ,Action 
       ,Username 
       ,questiontext 
       ,answer 
     From #Table21 
    ) y 
    pivot (max(Answer) for QuestionText in ([First Name],[Last Name],[Gender],[Age])) P 
+0

這仍然沒有幫助,他仍然需要一個組,以獲得每行只有一行 – Milney

+0

這是脆弱的,因爲表可能會改變,然後它會隨機停止工作......重複行仍然會產生重複。這在我看來是懶惰的,我不會讓過去的代碼審查 - 更安全的聚合 – Milney

+0

謝謝。我已經嘗試過這個答案,它也可以 – insomniac

1
CREATE TABLE #Table21 
    ([Answer] varchar(6), [QuestionText] varchar(10), [type] varchar(6), [QuestionID] int, [ResultID] int, [Action] int, [Username] varchar(5), [SurveyID] int) 
; 

INSERT INTO #Table21 
    ([Answer], [QuestionText], [type], [QuestionID], [ResultID], [Action], [Username], [SurveyID]) 
VALUES 
    ('FN 1', 'First Name', 'text', 3467, 2259, 2259, 'admin', 308), 
    ('LN 1', 'Last Name', 'text', 3468, 2259, 2259, 'admin', 308), 
    ('Male', 'Gender', 'radio', 3466, 2259, 2259, 'admin', 308), 
    ('12', 'Age', 'number', 3469, 2259, 2259, 'admin', 308), 
    ('FN 2', 'First Name', 'text', 3467, 2260, 2260, 'admin', 308), 
    ('LN 2', 'Last Name', 'text', 3468, 2260, 2260, 'admin', 308), 
    ('Female', 'Gender', 'radio', 3466, 2260, 2260, 'admin', 308), 
    ('12', 'Age', 'number', 3469, 2260, 2260, 'admin', 308) 

with cte as 
(
SELECT [ResultID],[Username],[Action],[First Name],[Last Name],[Gender],[Age] from 
      (
       select * 
       from #Table21 
      ) as y 
      pivot 
      (
       max(Answer) 
       for QuestionText in ([First Name],[Last Name],[Gender],[Age]) 
      ) as p 
      ) 


SELECT 
    [ResultID], 
    max([Username]) AS [Username], 
    MAX([Action]) AS [Action], 
    MAX([First Name]) AS [First Name], 
    MAX([Last Name]) AS [Last Name] , 
    MAX([Gender]) AS [Gender], 
    MAX([Age]) AS [Age] 
FROM CTE 
GROUP BY [ResultID]; 

輸出

ResultID Username Action First Name Last Name Gender Age 
2259 admin 2259 FN 1 LN 1 Male 12 
2260 admin 2260 FN 2 LN 2 Female 12 
-1

您還可以使用CASE表達式與領域聚合基本上PIVOT結果。我經常使用它,因爲如果由於某種原因,我想添加另一個聚合列,而不必再做另一個PIVOT。在某些情況下它也更快。

SELECT 
    [ResultID], 
    [UserName], 
    [Action], 
    MAX(CASE WHEN c.[QuestionText] = 'First Name' THEN [Answer] END) as [First Name], 
    MAX(CASE WHEN c.[QuestionText] = 'Last Name' THEN [Answer] END) as [Last Name], 
    MAX(CASE WHEN c.[QuestionText] = 'Gender' THEN [Answer] END) as [Gender], 
    MAX(CASE WHEN c.[QuestionText] = 'Age' THEN [Answer] END) as [Age] 
FROM 
    cte c 
GROUP BY 
    [ResultID], 
    [UserName], 
    [Action] 

例如:

WITH cte AS (SELECT * FROM (
VALUES 
    ('FN 1', 'First Name', 'text', 3467, 2259, 2259, 'admin', 308), 
    ('LN 1', 'Last Name', 'text', 3468, 2259, 2259, 'admin', 308), 
    ('Male', 'Gender', 'radio', 3466, 2259, 2259, 'admin', 308), 
    ('12', 'Age', 'number', 3469, 2259, 2259, 'admin', 308), 
    ('FN 2', 'First Name', 'text', 3467, 2260, 2260, 'admin', 308), 
    ('LN 2', 'Last Name', 'text', 3468, 2260, 2260, 'admin', 308), 
    ('Female', 'Gender', 'radio', 3466, 2260, 2260, 'admin', 308), 
    ('12', 'Age', 'number', 3469, 2260, 2260, 'admin', 308) 
) t([Answer],[QuestionText],[type],[QuestionID],[ResultID],[Action],[Username],[SurveyID])) 

SELECT 
    [ResultID], 
    [UserName], 
    [Action], 
    MAX(CASE WHEN c.[QuestionText] = 'First Name' THEN [Answer] END) as [First Name], 
    MAX(CASE WHEN c.[QuestionText] = 'Last Name' THEN [Answer] END) as [Last Name], 
    MAX(CASE WHEN c.[QuestionText] = 'Gender' THEN [Answer] END) as [Gender], 
    MAX(CASE WHEN c.[QuestionText] = 'Age' THEN [Answer] END) as [Age] 
FROM 
    cte c 
GROUP BY 
    [ResultID], 
    [UserName], 
    [Action] 


ResultID UserName Action  First Name Last Name Gender Age 
----------- -------- ----------- ---------- --------- ------ ------ 
2259  admin 2259  FN 1  LN 1  Male 12 
2260  admin 2260  FN 2  LN 2  Female 12