0

给定这个 SQL 输入表

GroupId   Item
1         Fish
1         FishBowl
2         Fish
3         Fish

我怎样才能得出这个输出?

Item     IsInGroup1   IsInGroup2   IsInGroup3
Fish     Y            Y            Y
FishBowl Y            N            N

请注意,组数可以是可变的

4

3 回答 3

2

通常,您不能使用标准 SQL 执行可变数量的组。您必须事先了解这些组。这是因为任何 SQL 查询都必须知道列数及其名称。

SELECT Item, 
  MAX(CASE GroupId WHEN 1 THEN 'Y' ELSE 'N' END) AS IsInGroup1, 
  MAX(CASE GroupId WHEN 2 THEN 'Y' ELSE 'N' END) AS IsInGroup2, 
  MAX(CASE GroupId WHEN 3 THEN 'Y' ELSE 'N' END) AS IsInGroup3
FROM ThisInputTable
GROUP BY Item;

Microsoft SQL Server 确实为 PIVOT 表提供了一些工具,但这不是标准 SQL。我不是 Microsoft 用户,所以我会给你一个“使用 PIVOT 和 UNPIVOT ”的链接,剩下的交给你。

于 2009-06-16T00:29:12.923 回答
1

关于SO的 常见 问题之一。

基本上,您可以使用动态 SQL 通过确定组数和每个组的名称来构建 Bill Karwin 给出的形式的查询。您生成的此类查询可以是 ANSI SQL。您还可以为 Bill 提到的 SQL Server 2008(2005 及更高版本)的 PI​​VOT 运算符生成专有语法。

我在第一个链接中的示例应该很清楚。

于 2009-06-16T00:56:43.060 回答
0

好吧,我想这取决于您使用的数据库。这对我有用:

选择项目,IF(GroupId=1,'Y','N') As IsInGroup1, IF(GroupId=2,'Y','N') As IsInGroup2, IF(GroupId=3,'Y','N') AsIsInGroup3New Table 按项目分组;

于 2009-06-16T00:30:23.310 回答