跨多行连接某些列

时间:2014-07-08 22:16:37

标签: sql grouping rows

我有一个看起来像这样的数据集

RID          SID          MID          QID          QText
------------------------------------------------------------------
NULL         NULL         NULL         10,20,30     't1','t2','t3'
10           14           13           4            'text2'
100          141          131          5,6          't5','t6'

我想运行一些sql命令,该命令基本上采用带有空值的行,并将QID和QText列连接到具有有效RID,SID,MID的每一行

所以最终结果将是一个类似于此的数据集(在这种情况下,第一行不需要在那里,因为我已将该行中的信息连接到其他行)。

RID          SID          MID          QID          QText
------------------------------------------------------------------
NULL         NULL         NULL         10,20,30     't1','t2','t3'
10           14           13           4,10,20,30   'text2','t1','t2','t3'
100          141          131          5,6,10,20,30 't5','t6','t1','t2','t3'

我已经尝试了几个具有不同分组的group_concats,但是无法让它以我需要的方式工作。原始SQL(mysql)可以实现这种转换吗?

到目前为止我尝试过的一些事情(非常糟糕的尝试,因为我只是不知道我将要做什么)

从myTable组中选择group_concat(QText)? < ---我不知道我可以分组的任何东西会给我我正在寻找的东西。这就是我非常糟糕的尝试。我知道他们错了(按id,qid等分组)。还考虑并尝试了我要连接的列的总和。

1 个答案:

答案 0 :(得分:0)

如果要将NULL行与所有非NULL行分组,请为每个组创建一个副本。例如,您可以派生出不同RID, SID, MID组合的列表

SELECT DISTINCT RID, SID, MID, QID, QText
FROM myTable
WHERE RID IS NOT NULL
   OR SID IS NOT NULL
   OR MID IS NOT NULL

并将其与NULL行交叉连接:

SELECT
  groups.RID, groups.SID, groups.MID,
  empty.QID, empty.QText
FROM
(
  SELECT DISTINCT RID, SID, MID
  FROM myTable
  WHERE RID IS NOT NULL
     OR SID IS NOT NULL
     OR MID IS NOT NULL
) AS groups
CROSS JOIN
(
  SELECT QID, QText
  FROM myTable
  WHERE RID IS NULL
    AND SID IS NULL
    AND MID IS NULL
) AS empty

然后将结果集合与原始集合组合:

SELECT RID, SID, MID, QID, QText
FROM myTable

UNION ALL

SELECT
  groups.RID, groups.SID, groups.MID,
  empty.QID, empty.QText
FROM
(
  SELECT DISTINCT RID, SID, MID
  FROM myTable
  WHERE RID IS NOT NULL
     OR SID IS NOT NULL
     OR MID IS NOT NULL
) AS groups
CROSS JOIN
(
  SELECT QID, QText
  FROM myTable
  WHERE RID IS NULL
    AND SID IS NULL
    AND MID IS NULL
) AS empty

现在只需将组合结果集用作派生表,并从中获取GROUP_CONCAT:

SELECT
  RID, SID, MID,
  GROUP_CONCAT(QID) AS QID,
  GROUP_CONCAT(QText) AS QText
FROM
(
  SELECT …  /* the above UNION ALL query here */
) AS s
GROUP BY
  RID, SID, MID
;