0

より良い形式の表を取得するには、リンクを参照してください

MySQL データベースには、以下のように 'VEHICLE' と 'VEHICLE_CLASS' の 2 つのテーブルがあります。

VEHICLE 
------------------------------------------- 
VEHICLE_ID  | VEHICLE_CLASS_ID  | STATUS 
------------------------------------------- 
vehicle_001 | vehicle_class_001 | 0 
vehicle_002 | vehicle_class_002 | 1 
vehicle_003 | vehicle_class_003 | 2 
vehicle_004 | vehicle_class_001 | 0 
vehicle_005 | vehicle_class_002 | 2 
vehicle_006 | vehicle_class_001 | 0 
vehicle_007 | NULL              | 1 
---------------------------------------------- 


VEHICLE_CLASS 
------------------------------------------ 
VEHICLE_CLASS_ID  | VEHICLE_CLASS_NAME 
----------------------------------------- 
vehicle_class_001 | ABC 
vehicle_class_002 | BCD 
vehicle_class_003 | EFG 
vehicle_class_004 | XYZ 
vehicle_class_005 | PQR 
vehicle_class_006 | STU 
--------------------------------------- 
  • 3 つのステータスがあります。0 = 開始済み、1 = 進行中、2 = 完了

以下のように結果行を取得するには、クエリが必要です。

----------------------------------------------------------------------- 
VEHICLE_CLASS_NAME | COMPLETED_ VEHICLES | NOT_COMPLETED_ VEHICLES 
--------------------------------------------------------------------------- 
ABC                |                     |vehicle_001, vehicle_004, vehicle_006 
BCD                | vehicle_005         |vehicle_002 
EFG                | vehicle_003         | 
  • Status=2 の場合は完了しています。それ以外の場合は完了していません。

これが私が書いたクエリですが、正しい行が得られません。

SELECT 
      veh.VEHICLE_CLASS_ID, 
      vehclass.VEHICLE_CLASS_NAME, 
      IF(STATUS=2, GROUP_CONCAT(`VEHICLE_ID`),'') COMPLETED_ VEHICLES, 
      IF(STATUS<2,GROUP_CONCAT(`VEHICLE_ID`),'') NOT_COMPLETED_ VEHICLES 
   FROM 
      VEHICLE veh 
         LEFT JOIN VEHICLE_CLASS vehclass 
            on veh.VEHICLE_CLASS_ID = vehclass.VEHICLE_CLASS_ID 
   GROUP BY 
      veh.VEHICLE_CLASS_ID 
   having 
      veh.VEHICLE_CLASS_ID is not null; 

どうすれば結果行を取得できますか。ありがとうございました。

4

2 に答える 2

1

MySQL

SELECT 
  vehclass.VEHICLE_CLASS_NAME, 
  GROUP_CONCAT(CASE veh.STATUS WHEN 2 THEN `VEHICLE_ID` ELSE NULL END) COMPLETED_VEHICLES, 
  GROUP_CONCAT(CASE veh.STATUS WHEN 2 THEN NULL ELSE `VEHICLE_ID` END) NOT_COMPLETED_VEHICLES 
FROM VEHICLE veh 
LEFT JOIN VEHICLE_CLASS vehclass 
  ON veh.VEHICLE_CLASS_ID = vehclass.VEHICLE_CLASS_ID 
GROUP BY veh.VEHICLE_CLASS_ID
HAVING veh.VEHICLE_CLASS_ID is not null;

SQLフィドル

MSSQL 2008

SELECT 
  vehclass.VEHICLE_CLASS_NAME, 
  STUFF((SELECT CASE v.STATUS WHEN 2 THEN ',' + v.VEHICLE_ID ELSE '' END
          FROM Vehicle v
          WHERE v.VEHICLE_CLASS_ID = veh.VEHICLE_CLASS_ID
          FOR XML PATH (''))
         , 1, 1, '') as COMPLETED_VEHICLES, 
  STUFF((SELECT CASE v.STATUS WHEN 2 THEN '' ELSE ',' + v.VEHICLE_ID END
          FROM Vehicle v
          WHERE v.VEHICLE_CLASS_ID = veh.VEHICLE_CLASS_ID
          FOR XML PATH (''))
         , 1, 1, '') as NOT_COMPLETED_VEHICLES
FROM VEHICLE veh 
LEFT JOIN VEHICLE_CLASS vehclass 
  ON veh.VEHICLE_CLASS_ID = vehclass.VEHICLE_CLASS_ID 
GROUP BY veh.VEHICLE_CLASS_ID, vehclass.VEHICLE_CLASS_NAME
HAVING veh.VEHICLE_CLASS_ID is not null;

SQLフィドル

オラクル

これをOracleで実装するには、GROUP_CONCATの代わりに何を使用するかについて、このリンクを参照してください

  1. カスタムのユーザー定義の集計関数 - おそらく最善の策
  2. wm_concat - 文書化されていない、サポートされていない、存在する可能性があります。
  3. リストタグ - 11g リリース 2
于 2012-05-03T16:48:58.077 に答える
1
SELECT 
  vechile_class.vechile_class_name,
  GROUP_CONCAT(v1.vechile_id) AS COMPLETED_VEHICLES,
  GROUP_CONCAT(v2.vechile_id) AS NOT_COMPLETED_VEHICLES
FROM vechile_class
LEFT JOIN vechile v1 ON 
  v1.vechile_class_id = vechile_class.vechile_class_id AND v1.status = 2
LEFT JOIN vechile v2 ON 
  v2.vechile_class_id = vechile_class.vechile_class_id AND v2.status <> 2
GROUP BY vechile.vechile_class_id
于 2012-05-03T16:53:17.283 に答える