我有一个表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
答案 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