将唯一列值转换为单独的“标志”列

时间:2019-06-21 13:59:16

标签: sql sql-server

在表“ 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”)逻辑,而是针对杂货店中的每个不同值自动执行此操作。项目列。

有什么方法可以进行这种概括,还是我只需要列出每个值?预先感谢。

1 个答案:

答案 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