2016-12-15 8 views
1

私はmysqlデータベースのテーブルに多くのレコードを持っているので、例として2つのレコードを取るだけです。ここでは、次のとおりです。ケース表現の列から行へ

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, 
     a.PRE_APPROVED_DATE, a.FIRST_APPROVED_DATE, a.SECOND_APPROVED_DATE 
FROM tb_master_repair_estimate a 
WHERE a.REPAIR_ESTIMATE_ID IN (21,23) 

私はこれを取得:

+--------------------+---------+-------------------+---------------------+----------------------+ 
| REPAIR_ESTIMATE_ID | EIR_REF | PRE_APPROVED_DATE | FIRST_APPROVED_DATE | SECOND_APPROVED_DATE | 
+--------------------+---------+-------------------+---------------------+----------------------+ 
|     21 | B6790 | 2016-12-15  | 2016-12-16   | NULL     | 
|     23 | J6791 | 2016-12-10  | 2016-12-11   | 2016-12-13   | 
+--------------------+---------+-------------------+---------------------+----------------------+ 
2 rows in set 

私の目標は、私は、列PRE_APPROVED_DATE、FIRST_APPROVED_DATE、SECOND_APPROVED_DATEに(私の心の中で)インデックスにしたいです。

PRE-> A 
FIRST -> B 
SECOND -> C 

だから、私はこのようなクエリを作成します: それはこのようにする必要があります

SET @pre = "A"; 
SET @first = "B"; 
SET @two = "C"; 

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, 
    CASE 
     WHEN a.PRE_APPROVED_DATE IS NOT NULL THEN @pre 
     WHEN a.FIRST_APPROVED_DATE IS NOT NULL THEN @first 
     WHEN a.SECOND_APPROVED_DATE IS NOT NULL THEN @two 
     ELSE 0 
    END AS `LEVEL` 
    FROM tb_master_repair_estimate a 

    WHERE a.REPAIR_ESTIMATE_ID IN (21,23) 

をしかし、私はこのように取得:

+--------------------+---------+-------+ 
| REPAIR_ESTIMATE_ID | EIR_REF | LEVEL | 
+--------------------+---------+-------+ 
|     21 | B6790 | A  | 
|     23 | J6791 | A  | 
+--------------------+---------+-------+ 
2 rows in set 

私はこの

のように必要
+--------------------+---------+-------+ 
| REPAIR_ESTIMATE_ID | EIR_REF | LEVEL | 
+--------------------+---------+-------+ 
|     21 | B6790 | A  | 
|     21 | B6790 | B  | 
|     23 | J6791 | A  | 
|     23 | J6791 | B  | 
|     23 | J6791 | C  | 
+--------------------+---------+-------+ 

助言... それはとても感謝します。

答えて

1

case式は必要ない、UNION ALLを使用します。

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, @pre as level 
FROM tb_master_repair_estimate a 
WHERE a.PRE_APPROVED_DATE IS NOT NULL -- "A" 
UNION ALL 
SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, @first as level 
FROM tb_master_repair_estimate a 
WHERE a.FIRST_APPROVED_DATE IS NOT NULL -- "B" 
UNION ALL 
SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, @second as level 
FROM tb_master_repair_estimate a 
WHERE a.SECOND_APPROVED_DATE IS NOT NULL -- "C" 

あなたがそれらの特定のIDのためにそれをしたい場合は、フィルタを追加します。

0

> あなたが試すことができます

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, 
    CASE 
     WHEN a.PRE_APPROVED_DATE IS NOT NULL THEN 'A'  
     ELSE '0' 
    END AS 'LEVEL' 
    FROM tb_master_repair_estimate a 
union all 

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, 
    CASE 
    WHEN a.FIRST_APPROVED_DATE IS NOT NULL THEN 'B' 
     ELSE '0' 
    END AS 'LEVEL' 
    FROM tb_master_repair_estimate a 
union all 

SELECT a.REPAIR_ESTIMATE_ID, a.EIR_REF, 
    CASE 
    WHEN a.SECOND_APPROVED_DATE IS NOT NULL THEN 'C' 
    ELSE '0' 
    END AS 'LEVEL' 
    FROM tb_master_repair_estimate a 
関連する問題