将唯一列值转换为单独的"flag"列



表格"杂货"包含"名称"和"项目"列,格式为:

*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"逻辑(,而是自动为杂货店中的任何不同值执行此操作。项目列。

有没有办法进行这种概括,或者我只需要列出每个值?提前谢谢。

首先创建 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

最新更新