如何在没有分组,计数,平均的情况下转动行

时间:2012-07-29 03:26:13

标签: sql database pivot-table

我正在从一个搞砸的数据库中重新编写一些表。一些表具有相同的具有不同表名的数据,并且每个表也具有相似的数据但具有不同的列名。无论如何,这是一个奇怪的请求,但这必须是这样的。

我需要将行向上移动以模拟一行,这样我就可以从两个不同的表创建一条记录。

我附上了一张照片。左边的表格将拉出一行,左边的表格将根据左表格中的id提供1到n行。我需要将行向上旋转以模拟一行,并使用两个结果创建一条记录。

从我的在线检查看,枢轴似乎是要走的路,但它似乎要我分组或做某种类型的聚合。

这样做的最佳方式是什么?

table1 ---Produces one row
table1id | col1 | col2 | col3
1    Wow    Wee    Zee

table2 ---Produces 1 - n rows
table2id | table1id | col1 | col2 | col3
1            1        sock   cloth  sup
2            1        bal    baa    zak
3            1         x      y    fooZ

需要看起来像这样(下面不是列名,它们是结果集)

Woo,wee,zee,sock,cloth,sup,bla,baaa,zak,x,y,fooZ

enter image description here

1 个答案:

答案 0 :(得分:1)

如果使用MySQL:

SELECT a.table1id, GROUP_CONCAT(a.col) AS col_values
FROM
(
    SELECT table1id, col1 col FROM table1 UNION ALL
    SELECT table1id, col2     FROM table1 UNION ALL
    SELECT table1id, col3     FROM table1 UNION ALL
    SELECT table1id, col1     FROM table2 UNION ALL
    SELECT table1id, col2     FROM table2 UNION ALL
    SELECT table1id, col3     FROM table2
) a
GROUP BY a.table1id

SQLFiddle Demo


如果使用SQL-Server:

SELECT a.table1id, b.colnames
FROM table1 a
CROSS APPLY
(
    SELECT STUFF((
        SELECT ',' + aa.col
        FROM
        (
            SELECT table1id, col1 col FROM table1 UNION ALL
            SELECT table1id, col2     FROM table1 UNION ALL
            SELECT table1id, col3     FROM table1 UNION ALL
            SELECT table1id, col1     FROM table2 UNION ALL
            SELECT table1id, col2     FROM table2 UNION ALL
            SELECT table1id, col3     FROM table2
         ) aa
         WHERE aa.table1id = a.table1id
         FOR XML PATH('')
    ), 1, 1, '') AS colnames
) b

SQLFiddle Demo