2017-11-30 5 views
0

多少汚れた表を正規化された表に変換する必要があります。テーブルの構造は以下の通りである:真/偽ファッションの値、ビット列が値0と1を含むことができるため多少this questionに類似しているが、注意点と値を新しい行の数として使用していくつかの列を集める

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 
); 

は、私は、代わりに、ビット/整数を有しますbi列は正の数と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列は複数回表示されることがあります。その他、別の行がありますしない限りは、dirty_tableのこの抜粋に見られるように、日付、名前とPROC列の唯一の組み合わせを持っている可能性があり:

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文を使用しようとしているだけでは、単一を作成するました行。値を作成する新しい行の数として1レコードから複数の行を作成するにはどうすればよいですか?私は一般的なSQLを使用する方が好きですが、私はMariaDBを使用しています。

答えて

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ための複数の行こと。

関連する問題