2016-12-07 85 views
2

我有一個表MyTable其中下面是三個主要列。varchar列上的Min()和Max()的行爲不一致

ContactId | QuestionId | ResponseValue 
    8   31   Ankush Agro 
    8   32   Pramod Gho 
    9   31   Pawansut K S K 
    9   32   sandip mor 

以上ResponseValue列是動態列。即 響應值根據來自問題管理員的問題ID而改變。

換句話說,這是個什麼表間接代表,

ContactId | Question |  ResponseValue 
    8   Shop Name   Ankush Agro 
    8   Owner Name   Pramod Gho 
    9   Shop Name   Pawansut K S K 
    9   Owner Name   sandip mor 

所以現在我的要求是,我需要每個課題名稱的問題列 的列標題。即Pivot商店名稱和所有者名稱表。 由於聚合函數不能在非數字列我使用min()Max()功能

像這樣,

Select 
max(Case MyTable.QuestionID When '31' Then ResponseValue else 'N/A' End) [Shop Name], 
max(Case MyTable.QuestionID When '32' Then ResponseValue else 'N/A' End) [Owner Name] 
from MyTable 
left join QuestionMaster on QuestionMaster.QuestionId= MyTable.QuestionId 
where MyTable.QuestionId in (31,32) 

問題即我面臨是, 如果我使用Max()上使用的shopname只顯示第二個記錄的商店名稱值,但第一個記錄是'N/A'

Shop Name  | Owner Name 
Pawansut K S K  sandip mor 
    N/A    Pramod Gho 

當我使用Min()反之亦然發生

Shop Name  | Owner Name 
    N/A    sandip mor 
Ankush Agro   Pramod Gho 

有人能給我爲什麼發生這種情況的洞察力?

這是我多麼希望我的查詢讓結果集

Shop Name  | Owner Name 
    Pawansut K S K  sandip mor 
    Ankush Agro   Pramod Gho 
+0

我刪除了MySQL的標記,因爲你似乎是使用SQL Server。 –

+0

請顯示您期望的_exact_輸出。我認爲你對數據透視查詢的工作方式感到困惑。 –

+0

@TimBiegeleisen您之前發佈的答案對我有用 –

回答

3

你樞查詢有問題。你應該在CASE表達的ELSE部分使用NULL值:

SELECT COALESCE(MAX(CASE WHEN t1.QuestionID = '31' 
         THEN t1.ResponseValue ELSE NULL END), 'N/A') AS [Shop Name], 
     COALESCE(MAX(CASE WHEN t1.QuestionID = '32' 
         THEN t1.ResponseValue ELSE NULL END), 'N/A') AS [Owner Name] 
FROM MyTable t1 
LEFT JOIN QuestionMaster t2 
    ON t2.QuestionId = t1.QuestionId 
WHERE t1.QuestionId IN (31, 32) 
GROUP BY t1.QuestionId