使用值作为新行的数量收集多个列

时间:2017-11-30 16:15:14

标签: sql

我想将一个有点脏的表转换为规范化的表。该表的结构如下:

CREATE TABLE dirty_table(
   date            DATE  NOT NULL
  ,name            VARCHAR(24) NOT NULL
  ,co              BIT  NOT NULL
  ,en              BIT  NOT NULL
  ,re              BIT  NOT NULL
  ,po              BIT  NOT NULL
  ,ga              BIT  NOT NULL
  ,pr              BIT  NOT NULL
  ,bi              INTEGER  NOT NULL
);

this question有些相似但有一点需要注意,我有一个位/整数而不是真/假方式的值,位列可以包含值0和1,双列可以包含任何正数和0我想创建一个新行保持名称和日期列以及非零列的名称。像这样:

date       |name      |proc |
-----------|----------|-----|
2017-07-04 |Jonny doe |bi   |
2017-07-04 |Jonny doe |bi   |
2017-07-07 |Jonny doe |ga   |
2017-07-04 |Jonny doe |po   |
2017-07-04 |Jonda doe |en   |
2017-07-04 |Jonda doe |co   |
2017-07-07 |Jonda doe |re   |
2017-07-07 |Jonda doe |re   |
2017-08-03 |Jonda doe |re   |
2017-08-08 |Josep doe |en   |
2017-08-09 |Josep doe |bi   |
2017-08-11 |Josep doe |ga   |

可以看出,如果值> 1,则bi列可以出现几次。其他人,除非有另一行,可能只有一个date,name和proc列的组合,如dirty_table的摘录中所示:

date        name    co  en  re  po  ga  pr  bi
2017-07-03  DPSUW   1   1   0   0   0   0   2
2017-07-03  XDUPT   1   0   0   0   0   0   0
2017-07-03  XIYUD   0   1   0   0   0   0   1
2017-07-03  HBJRL   1   1   0   0   0   0   2
2017-07-03  DIHMP   1   1   0   0   0   0   1
2017-07-04  MTHDT   1   1   0   0   0   0   2
2017-07-04  MFPLI   0   1   0   0   0   0   1
2017-07-04  GKHFG   1   0   0   0   0   0   1
2017-07-04  QKDNE   1   1   0   0   0   0   2
2017-07-04  GSXLN   1   1   0   0   0   0   2
2017-07-05  ICKUT   0   1   0   0   0   0   1
2017-07-05  NHVLT   0   1   0   0   0   0   1
2017-07-05  KTSFX   1   1   0   0   0   0   1
2017-07-05  AINSA   1   1   0   0   0   0   2
2017-07-07  YUCAU   0   1   0   0   0   0   1
2017-07-07  YLLVX   1   0   0   0   0   0   1
2017-07-10  CSIMK   1   1   0   0   0   0   2
2017-07-10  PWNCV   0   1   0   0   0   0   1
2017-07-10  AMMVX   0   1   0   0   0   0   1
2017-07-11  BLELT   0   1   0   0   0   0   1
2017-07-11  ONAKD   0   1   0   0   0   0   1
2017-07-11  IGJDK   1   0   0   0   0   0   1
2017-07-11  TOQLH   1   1   0   0   0   0   2
2017-07-11  DUQWM   1   0   0   0   0   0   0
2017-07-11  SFWVP   1   1   0   0   0   0   2
2017-07-12  MQVHW   0   1   0   0   0   0   1
2017-07-12  OFHWQ   0   1   0   0   0   0   1
2017-07-12  MPOAK   1   1   0   0   0   0   1
2017-07-12  YPFEH   1   1   0   0   0   0   1
2017-07-12  XUENE   1   0   0   0   0   0   1

我试图使用case语句,但只创建一行。如何使用值作为要创建的新行数从一个记录创建多个行?我更喜欢使用通用SQL,但我使用的是MariaDB。

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是union all

select date, name, 'co' as proc from t where co >= 1 union all
select date, name, 'en' as proc from t where en >= 1 union all
. . .
select date, name, 'bi' as proc from t where bi >= 1 union all
select date, name, 'bi' as proc from t where bi >= 2;

bi的多行。