为A列

时间:2015-09-18 09:25:19

标签: sql concatenation aggregate-functions

参见下表:

CREATE TABLE boxes (
    box integer,
    color character varying,
    size integer,
    ...
);

boxcolor都可以假设不是小的唯一值 集。

使用以下方式查询此表:

SELECT color, box FROM boxes;

结果将类似于:

+-------+-----+
| color | box |
+-------+-----+
| blue  |   2 |
| blue  |   3 |
| blue  |   4 |
| green |   1 |
| green |   3 |
| red   |   1 |
| red   |   2 |
| red   |   2 |
+-------+-----+

是否可以以这样的方式查询此表:结果有两列,一列包含数组(或字符串或列表),每个不同的box具有不同的color值?

结果应该是这样的:

+-------+-----------+
| color | box_types |
+-------+-----------+
| blue  | {2,3,4}   |
| green | {1,3}     |
| red   | {1,2}     |
+-------+-----------+

其中color列必须包含唯一值,并且每行必须在聚合列中仅包含不同的box个数字。

鉴于此问题的非不可知性,我想收集主要DBMS的所有最佳解决方案。在回答时,请指定每个查询的DBMS。

3 个答案:

答案 0 :(得分:3)

好吧,在MySQL中你可以做到以下几点:

select color, group_concat(box) from tbl group by color

在Oracle中:

select color, wm_concat(box) from tbl group by color

答案 1 :(得分:3)

请尝试以下。

SELECT
    color ,
     STUFF(
         (SELECT DISTINCT ',' +CONVERT(varchar(10), box)   
          FROM boxes 
          WHERE color = a.color 
          FOR XML PATH (''))
          , 1, 1, '') AS box_types
FROM boxes  AS a
GROUP BY color;

检查SQL Fiddle

答案 2 :(得分:0)

首先,这是对“正常化”原则的否定,换言之,它是“坏”。

但是,有一些dbms,如Microsoft SQL Server,使用PIVOT(以及它相反的UNPIVOT)实现了这种可能性。

此子句允许创建一个表(使用您的示例),如下所示:

+-------+------+------+------+
| color | box1 | box2 | box3 |
+-------+------+------+------+
| blue  |    2 |    3 |    4 |
| green |    1 |    3 | null |
| red   |    1 |    2 | null |
+-------+------+------+------+