在varchar列

时间:2016-12-07 05:35:57

标签: sql-server

我有一个表MyTable,其中下面是三个主要列。

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)

我面临的问题是, 如果我在shopname上使用Max(),则仅显示第二个记录'shopname值,但第一个记录为'N / A'

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

当我使用Min()副Versa发生时

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

1 个答案:

答案 0 :(得分:3)

您的透视查询存在问题。您应该在NULL表达式的ELSE部分中使用CASE值:

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