Sql server 按带有计数的动态列表分组

Sql server 按带有计数的动态列表分组,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我使用一个简单的case语句来统计数据中出现的breakcode,并按Seller和SaleDate进行分组 然而,这似乎是一个不雅观的解决方案。breakcode可以而且很可能会扩展,当它扩展时,我需要更新我的代码。如何做到这一点 此外,虽然使用NULL可以给出正确的答案,但我想知道是否有更好的方法来计算breakcode的实例,将NULL替换为0会返回不正确的结果 SELECT seller, saledate, COUNT(CASE WHEN breakcode = 1 then 1 E

我使用一个简单的case语句来统计数据中出现的breakcode,并按Seller和SaleDate进行分组

然而,这似乎是一个不雅观的解决方案。breakcode可以而且很可能会扩展,当它扩展时,我需要更新我的代码。如何做到这一点

此外,虽然使用NULL可以给出正确的答案,但我想知道是否有更好的方法来计算breakcode的实例,将NULL替换为0会返回不正确的结果

SELECT seller, 
saledate,
COUNT(CASE WHEN breakcode = 1 then 1 ELSE NULL END) as [Perfect],
COUNT(CASE WHEN breakcode = 2 then 1 ELSE NULL END) as [Simple],
COUNT(CASE WHEN breakcode = 3 then 1 ELSE NULL END) as [Medium],
COUNT(CASE WHEN breakcode = 4 then 1 ELSE NULL END) as [Dual1],
COUNT(CASE WHEN breakcode = 5 then 1 ELSE NULL END) as [Dual2],
COUNT(CASE WHEN breakcode = 6 then 1 ELSE NULL END) as [Hard],
COUNT(CASE WHEN breakcode = 7 then 1 ELSE NULL END) as [Difficult]
FROM test
GROUP BY seller, sale date
谢谢


SQLFIDLE:

通过注释开发的最终版本:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @cols AS NVARCHAR(MAX)

SELECT @cols= ISNULL(@cols + ',','') + QUOTENAME(case when breakname like 'Perfect%' then 'Perfect' else breakname end)
FROM (select * from breaks where breakname not like 'Perfect - 90') a
group by id, breakname
order by id


SET @sql =
  N'SELECT seller, saledate, ' + @cols + '
    FROM (select seller, saledate, case when breakname like ''Perfect%'' then ''Perfect'' else breakname end breakname from test 
    inner join breaks on case when breakcode = 8 then 1 else breakcode end = id) derived
    PIVOT(count(breakname)
          FOR derived.breakname IN (' + @cols + ')) AS PVTTable
        ORDER BY seller, saledate'

EXEC sp_executesql @sql

您是否有
breakcode=1
表示
完美的“某处”?如果没有,那么您将使用动态sql得到名为
1
的列。“Breakcode”是另一个表中保存的“breakname”的id。我在这里尝试过简化。包括这一点会使回答更容易,因为代码会不同。
Breakcode
breakname
的id,它本身保存在另一个表
Breaks
中。我在这里尝试过简化。最后,我想按
进行分组,比如Perfect%
或其他中断名称。@user1773949简化实际问题并不是获得解决方案的最佳方法。您应该包括正确回答问题所需的所有详细信息。@bluefeet好的,让我快速创建一个新提琴。JPW的答案是正确的,但我希望使用中断名称来代替列标题编号。等一下…@bluefeet我如何更改标题的顺序以匹配id顺序而不是fiddle中的文本顺序:?似乎无法改变它。这是中项目的顺序PIVOT@jpw您必须使用
分组依据
顺序依据
,而不是
不同的
--