在表“ Groceries”中具有“名称”和“项目”列,格式为:
*Name* | *Item*
Bill | Eggs
Bill | Milk
Sam | Eggs
Sam | Turkey
Sam | Butter
Josh | Milk
Josh | Butter
我希望对查询进行一般化,以将这些“项目”投射到它们自己的列中,作为标志。
我当前的查询实质上是:
SELECT
MAX(CASE WHEN grocery.Item = 'Eggs' THEN 1 ELSE 0 END) 'Eggs',
MAX(CASE WHEN grocery.Item = 'Milk' THEN 1 ELSE 0 END) 'Milk',
MAX(CASE WHEN grocery.Item = 'Turkey' THEN 1 ELSE 0 END) 'Turkey',
MAX(CASE WHEN grocery.Item = 'Butter' THEN 1 ELSE 0 END) 'Butter'
FROM
Groceries grocery
可行,但是我想以某种方式将其概括化,以使查询而不是列出每个唯一值并在每个值上使用此“ MAX(CASE WHEN”)逻辑,而是针对杂货店中的每个不同值自动执行此操作。项目列。
有什么方法可以进行这种概括,还是我只需要列出每个值?预先感谢。
答案 0 :(得分:0)
首先创建select子句:
DECLARE @SELECT VARCHAR(MAX)=''
SELECT @SELECT = @SELECT + ',MAX(CASE WHEN grocery.Item =''' + ITEM + ''' THEN 1 ELSE 0 END) ['+ITEM+']'+CHAR(13) FROM (SELECT DISTINCT ITEM FROM Groceries) grocery
SELECT @SELECT = STUFF(@SELECT,1,1,'')
然后创建查询并执行它:
DECLARE @QUERY NVARCHAR(MAX)='
SELECT '+@SELECT+' FROM Groceries grocery
'
EXEC sp_executesql @STMT = @QUERY