2016-10-04 77 views
1

我与此查询工作:加入总一行总和计数

SELECT PAS.NAME, 
(
    SELECT COUNT(*) FROM CUSOMERS WHERE C_ID = 90 
    AND CONTRACT_TYPE = 80 
    AND CONTRACT_DATE >= TO_DATE('20160101', 'YYYYMMDD') 
    AND CONTRACT_DATE <= TO_DATE('20161231', 'YYYYMMDD') 
    AND ORDER_ID = ORDERS.ID 
    AND STATUS = 1 
) AS ORDER_SHIPPED_COUNT FROM ORDERS INNER JOIN PAS ON ORDERS.ID = PAS.ID 
WHERE ORDERS.COUNTRY = 123 
AND ORDERS.PAYMENT = 30 
AND ORDERS.CONTRACT_TYPE = 80 
AND PAS.NAME LIKE 'HAS SHIPPED - %'; 

结果我得到的是以下几点:

NAME       ORDER_SHIPPER_COUNT 
HAS SHIPPED ON TIME   654 
HAS SHIPPED LATE    23 
HAS SHIPPED AND LOST   2 

而且我想结果是这样

NAME       ORDER_SHIPPER_COUNT 
HAS SHIPPED ON TIME   654 
HAS SHIPPED LATE    23 
HAS SHIPPED AND LOST   2 
TOTAL      679 

感谢所有

回答

1
with t as (
SELECT PAS.NAME, 
(
    SELECT COUNT(*) FROM CUSOMERS WHERE C_ID = 90 
    AND CONTRACT_TYPE = 80 
    AND CONTRACT_DATE >= TO_DATE('20160101', 'YYYYMMDD') 
    AND CONTRACT_DATE <= TO_DATE('20161231', 'YYYYMMDD') 
    AND ORDER_ID = ORDERS.ID 
    AND STATUS = 1 
) AS ORDER_SHIPPED_COUNT FROM ORDERS INNER JOIN PAS ON ORDERS.ID = PAS.ID 
WHERE ORDERS.COUNTRY = 123 
AND ORDERS.PAYMENT = 30 
AND ORDERS.CONTRACT_TYPE = 80 
AND PAS.NAME LIKE 'HAS SHIPPED - %') 
select * 
from t 
union all 
select 'TOTAL',sum(ORDER_SHIPPER_COUNT) from t; 

如果你通过查询获取唯一的记录,那么你也可以使用下面的查询,而无需使用UNION ALL:

with t as (
SELECT PAS.NAME, 
(
    SELECT COUNT(*) FROM CUSOMERS WHERE C_ID = 90 
    AND CONTRACT_TYPE = 80 
    AND CONTRACT_DATE >= TO_DATE('20160101', 'YYYYMMDD') 
    AND CONTRACT_DATE <= TO_DATE('20161231', 'YYYYMMDD') 
    AND ORDER_ID = ORDERS.ID 
    AND STATUS = 1 
) AS ORDER_SHIPPED_COUNT FROM ORDERS INNER JOIN PAS ON ORDERS.ID = PAS.ID 
WHERE ORDERS.COUNTRY = 123 
AND ORDERS.PAYMENT = 30 
AND ORDERS.CONTRACT_TYPE = 80 
AND PAS.NAME LIKE 'HAS SHIPPED - %') 
select nvl(name,'TOTAL') name, 
     sum(ORDER_SHIPPER_COUNT) ORDER_SHIPPER_COUNT 
from t 
group by rollup(name); 
+0

谢谢!!它的工作 – Chrix1387

+0

你可以检查第二个查询,如果它也适用于你。 – hemalp108