2012-05-10 31 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