2012-05-10 35 views
0

Please click here for sample tables and description.通用SQL查詢與組由

我有兩個表「車輛」和「VEHICLE_CLASS」作爲每附圖像。

我需要一個查詢來獲取結果行,每個VEHICLE_CLASS按照狀態分組了多少個VEHICLES,如附圖所示。

查詢應該是通用的,所以它可以在任何數據庫(MySQL的/甲骨文/ MSSQL/DB2)

使用請幫助。

CREATE TABLE VEHICLE 
(
    VEHICLE_ID varchar(20), 
    VEHICLE_CLASS_ID varchar(30), 
    STATUS int 
); 

CREATE TABLE VEHICLE_CLASS 
(
    VEHICLE_CLASS_ID varchar(30), 
    VEHICLE_CLASS_NAME varchar(30) 
); 

INSERT INTO VEHICLE 
    (VEHICLE_ID, VEHICLE_CLASS_ID, STATUS) 
VALUES 
    ('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); 


INSERT INTO VEHICLE_CLASS 
    (VEHICLE_CLASS_ID, VEHICLE_CLASS_NAME) 
VALUES 
    ('vehicle_class_001', 'ABC'), 
    ('vehicle_class_002', 'BCD'), 
    ('vehicle_class_003', 'EFG'); 

這裏是我試過,但沒能得到期望的結果查詢:

SELECT veh.VEHICLE_CLASS_ID, vehclass.VEHICLE_CLASS_NAME, 
    SUM(CASE WHEN veh.STATUS=2 THEN COUNT(veh.VEHICLE_ID) end) Completed, 
    SUM(CASE WHEN veh.STATUS!=2 THEN COUNT(veh.VEHICLE_ID) end) not_completed 
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; 

回答

1

你在哪裏八九不離十。而不是SUM(CASE WHEN veh.STATUS=2 THEN COUNT(veh.VEHICLE_ID)它的,然後1,你也需要由VEHICLE_CLASS_NAME組(除了在MySQL中,但你希望它在其他工作)。

SELECT veh.VEHICLE_CLASS_ID, 
     vehclass.VEHICLE_CLASS_NAME, 
     Sum(CASE 
      WHEN veh.STATUS = 2 THEN 1 
      END) Completed, 
     Sum(CASE 
      WHEN veh.STATUS <> 2 THEN 1 
      END) not_completed 
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; 

DEMO SQL Server

DEMO MySQL

DEMO Oracle

  • 作爲Lamak指出<>通常使用,但其似乎!=得到很好的支持,但您需要測試
  • 我沒有添加Else 0因爲圖像在SUM_not_completed中包含空格。您可以選擇這樣做或添加COALACE如果你想零
  • 如果你知道你在MySQL中,你可以刪除CASESum(veh.STATUS = 2) Completed
+0

+1,你打我答案。我做出的唯一改變(以及我在我的回答中做的)是用'<>'替換'!=',以便在不同的RDBM上工作 – Lamak

+0

@Lamak這很奇怪。我總是寫'<>',但它在SQL Server Oracle和MySQL上工作。 –

+0

真的嗎?我知道''='在SQL上工作,我認爲我確信它不在MySQL上,也許他們會在更新的版本中添加它。很高興知道!謝謝 – Lamak

0

試試這個:

SELECT veh.VEHICLE_CLASS_ID, 
     vehclass.VEHICLE_CLASS_NAME, 
     SUM(CASE WHEN veh.STATUS = 2 THEN 1 ELSE 0 END) Completed, 
     SUM(CASE WHEN veh.STATUS <> 2 THEN 1 ELSE 0 END) not_completed 
FROM VEHICLE veh 
LEFT JOIN VEHICLE_CLASS vehclass 
ON veh.VEHICLE_CLASS_ID = vehclass.VEHICLE_CLASS_ID 
WHERE veh.VEHICLE_CLASS_ID IS NOT NULL 
GROUP BY veh.VEHICLE_CLASS_ID, vehclass.VEHICLE_CLASS_NAME; 
0

也許是這樣的:

SELECT 
    VEHICLE_CLASS.VEHICLE_CLASS_NAME, 
    (
     SELECT 
      COUNT(*) 
     FROM 
      VEHICLE 
     WHERE 
      VEHICLE.STATUS=2 
      AND VEHICLE.VEHICLE_CLASS_ID=VEHICLE_CLASS.VEHICLE_CLASS_ID 
    ) AS SUM_Completed, 
    (
     SELECT 
      COUNT(*) 
     FROM 
      VEHICLE 
     WHERE 
      VEHICLE.STATUS IN (1,0) 
      AND VEHICLE.VEHICLE_CLASS_ID=VEHICLE_CLASS.VEHICLE_CLASS_ID 
    ) AS SUM_Not_Completed 
FROM 
    VEHICLE_CLASS 
0
select vehclass.VEHICLE_CLASS_NAME, 
    SUM(case when veh.status = 2 then 1 end) Completed, 
    SUM(case when veh.status != 2 then 1 end) not_completed 
from VEHICLE veh 
left join VEHICLE_CLASS vehclass on veh.VEHICLE_CLASS_ID = vehclass.VEHICLE_CLASS_ID 
where veh.VEHICLE_CLASS_ID is not null 
group by veh.VEHICLE_CLASS_NAME 
0
SELECT VC.VEHICLE_CLASS_ID, VC.VEHICLE_CLASS_NAME, 
    SUM(CASE WHEN V.STATUS=2 THEN 1 ELSE 0 END) Completed, 
    SUM(CASE WHEN V.STATUS!=2 THEN 1 ELSE 0 END) not_completed 
FROM VEHICLE V 
    JOIN VEHICLE_CLASS VC on V.VEHICLE_CLASS_ID = VC.VEHICLE_CLASS_ID 
GROUP BY VC.VEHICLE_CLASS_ID, VC.VEHICLE_CLASS_NAME