2016-08-21 20 views
0

内の値を決定します。私が何をしようとしています何SQLは、追加して、私は次のスキーマを持っているセル

CREATE TABLE table1(colA DATE, colB INT, colC TEXT); 

INSERT INTO table1(colA, colB, colC) VALUES ("2016-01-01", "1", "C1"); 
INSERT INTO table1(colA, colB, colC) VALUES ("2016-01-02", "2", "C2"); 

CREATE TABLE table2(colD TEXT, colE TEXT, colF TEXT); 

INSERT INTO table2(colD, colE, colF) VALUES ("2016-01-03", "3", "F1"); 
INSERT INTO table2(colD, colE, colF) VALUES ("2016-01-04", "4", "F2"); 

は、別の列(colG)を追加し、他の1つのテーブルを追加しています。 colAの日付範囲に応じて、colGの各セルに異なるメッセージを表示する必要があります。また、整数の値に応じてメッセージを持つ別の列を追加します。だから私は一般的なアプローチを探しています。任意のアイデアを達成する方法?とても有難い。これは私が試したことです:

SELECT colA, 
     colB, 
     CASE When date <2016-01-01 "daterange A" 
      When date <2016-01-01<2016-01-02 "daterangeB" 
      When date <2016-01-02<2016-01-03 "daterangeC" 
      When date <2016-01-03<2016-01-04 "daterangeD" 

     AS colG 
FROM (
    SELECT colA, colB FROM table1 
    UNION ALL 
    SELECT colD, colE FROM table2 
) union_tbl; 
+0

? – scaisEdge

答えて

0

あなたの構文が正しい場合は、SQLはあなたが望むことをする必要があります。このような何か:

SELECT colA, 
     colB, 
     (CASE When date < '2016-01-01' then 'daterange A' 
      When date < '2016-01-02' then 'daterangeB' 
      When date < '2016-01-03' then 'daterangeC' 
      When date < '2016-01-04' then 'daterangeD' 
     END) AS colG 
FROM (SELECT colA, colB FROM table1 
     UNION ALL 
     SELECT colD, colE FROM table2 
    ) t; 

注:

  • 日付定数は(ほとんどのデータベースに)単一引用符で囲まする必要があります。
  • 文字列定数は、単一引用符(ANSI標準)で囲む必要があります。
  • caseステートメントは、各節を順番に評価するので、論理を簡素化できます。
0

テーブルのデータ型は本当にありますか?

  • はコーラDATEで、寒さがTEXT
  • COLBがINTであるとCOLEは、上記のデータ型が正しいか、あなたの組合文は失敗し、ほとんどのデータベースエンジンでTEXT

です。ほとんどのリレーショナルデータベースエンジンでは、ユニオンステートメントのメンバー間でデータ型が一致する必要があります。

SELECT colA, 
     colB, 
     (CASE When date < '2016-01-01' then 'daterange A' 
      When date < '2016-01-02' then 'daterangeB' 
      When date < '2016-01-03' then 'daterangeC' 
      When date < '2016-01-04' then 'daterangeD' 
     END) AS colG 
FROM (SELECT 
      CAST(colA AS TEXT) AS colA 
      , CAST(colB AS TEXT) AS colB 
     FROM table1 
     UNION ALL 
     SELECT colD, colE FROM table2 
    ) tba; 
0

ます。また、列の日付を取得した日に、あなたの文字列の日付を変換する必要があり、あなたは、この値を取得したテーブルから列日付...がある

SELECT colA, 
     colB, 
     (CASE When `date` < str_to_date('2016-01-01', '%Y-%m%d') then 'daterange A' 
       When `date` < str_to_date('2016-01-02', '%Y-%m%d') then 'daterangeB' 
       When `date` < str_to_date('2016-01-03', '%Y-%m%d') then 'daterangeC' 
       When `date` < str_to_date('2016-01-04', '%Y-%m%d') then 'daterangeD' 
      END) AS colG 
    FROM (SELECT colA, colB, `date` FROM table1 
     UNION ALL 
     SELECT colD, colE, `date` FROM table2 
     ) my_t; 
関連する問題