将重复的行转换为列

时间:2018-08-29 10:11:41

标签: mysql pivot

我尝试了不同的方法,希望有人能为我提供一个优雅的解决方案。

  • 我仅具有对表的读取权限(无法创建过程),我的仪表板可以接受MYSQL嵌套查询。

我需要显示一个表格:issues,其中包含案例编号 问题是有些问题的案件编号不止一个

我有一个

  • Issues
  • Cases

我计划将一个派生表(在4列中最多显示4个CaseNr)与问题表连接起来。 我需要派生此表的帮助

表格:Cases

IssueIDfk | CaseNR | CaseStatus
-------------------------------
1         | A1     | Open
1         | A5     | Open
1         | C7     | Closed
2         | BA     | Open
2         | ZA     | Open
2         | 12     | Open
3         | A3     | Open
4         | 99     | Open

我需要将其加入到Issues表IssueIDfk中 无需创建重复的行

因此,我需要像这样的派生表:

IssueIDfk | First_CaseNR | First_CaseStatus | Secnd_CaseNR | Secnd_CaseStatus..
-------------------------------
1         | A1           | Open             | A5           | Open ..
2         | BA           | Open             | ZA           | Open ..
3         | A3           | Open             | <NULL>       | <NULL> ..

则每条记录的最大CaseNR数为4

我当前的查询:

    SELECT DISTINCT
      Cases.IssueIDfk,
      (SELECT          t1.CaseNR     FROM      Case t1    WHERE      t1.IssueIDfk = Cases.IssueIDfk    LIMIT 1) AS First_CaseNR,
      (SELECT      Max(t2.CaseNR)    FROM      Case t2    WHERE      t2.IssueIDfk = Cases.IssueIDfk    LIMIT 2) AS Secnd_CaseNR,
      (SELECT      Max(t3.CaseNR)    FROM      Case t3    WHERE      t3.IssueIDfk = Cases.IssueIDfk    LIMIT 3) AS Thrd_CaseNR
      ...First_CaseStatus,
      ...Secnd_CaseStatus,
      ...Thrd_CaseStatus   ????

    FROM
      Cases

此SQL不会提供空值,我也不知道如何添加CaseStatus列

要使用此方法创建案例表:

r2d2作为数据库

CREATE TABLE `r2d2`.`Case`
(
   `IssueIDfk_` INTEGER NOT NULL,
   `_CaseNR_` VARCHAR(12) NOT NULL,
   `_CaseStatus` VARCHAR(12) NULL,
   PRIMARY KEY (`_CaseNR_`)
);
INSERT INTO `r2d2`.`Case`
(`IssueIDfk_`,`_CaseNR_`,`_CaseStatus`)
VALUES
(1,' A1     ',' Open'),
(1,' A5     ',' Open'),
(1,' C7     ',' Closed'),
(2,' BA     ',' Open'),
(2,' ZA     ',' Open'),
(2,'12',' Open'),
(3,' A3     ',' Open'),
(4,'99',' Open');

更新:.......解决方案可在我的模拟中使用,但不幸的是,不适用于仪表板

我修改了来自
的查询 https://stackoverflow.com/a/28067142/1435526  由Gordon Linoff

SELECT o.IssueID,
       MAX(case when rank = 1 then oc.CaseNumber end) as Case_1,
       MAX(case when rank = 1 then oc.Type end) as Type_1,
       MAX(case when rank = 1 then oc.CreatedDate end) as CreatedDate_1,
       MAX(case when rank = 2 then oc.CaseNumber end) as Case_2,
       MAX(case when rank = 2 then oc.Type end) as Type_2,
       MAX(case when rank = 2 then oc.CreatedDate end) as CreatedDate_2
FROM Issues o LEFT JOIN
     (SELECT 
        oc.*,
       (@rn := if(@o = IssueIDfk, @rn + 1, if(@o := IssueIDfk, 1, 1))) as rank

      FROM Cases oc CROSS JOIN
           (SELECT @rn := 0, @o := 0) vars
      ORDER BY oc.IssueIDfk
     ) oc
     ON o.IssueID = oc.IssueIDfk
GROUP BY o.IssueIDfk

可以在我的模拟中工作,但不幸的是,不在仪表板中工作

ERROR 1351: View's SELECT contains a variable or parameter

更新2:

https://stackoverflow.com/a/9652359/1435526上工作似乎可以在仿真中完成

0 个答案:

没有答案