我想提出一个查询来选择customer id
,cus_name
,Total COD Orders
。我做了这两个查询,但这些查询分别计算COD
和NON COD
。我如何使用子查询进行单个查询。
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders'
FROM T_Acct_CompanyProfile c INNER JOIN
T_Inv_Order o
ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 1
GROUP BY o.cust_id, c.name;
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders'
FROM T_Acct_CompanyProfile c INNER JOIN
T_Inv_Order o
ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 0
GROUP BY o.cust_id, c.name;
答案 0 :(得分:2)
使用条件聚合:
SELECT o.cust_id,
UPPER(c.name),
SUM(CASE WHEN o.cod = 1 THEN 1 ELSE 0 END) AS 'Total COD Orders',
SUM(CASE WHEN o.cod = 0 THEN 1 ELSE 0 END) AS 'Total non COD Orders'
FROM T_Acct_CompanyProfile c
INNER JOIN T_Inv_Order o ON c.id = o.cust_id
WHERE c.type_id = 1
group by o.cust_id, c.name
答案 1 :(得分:1)
由于查询看起来非常相似,您可以使用union
。所以你的查询变成了:
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders' FROM T_Acct_CompanyProfile c
INNER JOIN T_Inv_Order o ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 1
group by o.cust_id, c.name
UNION
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders' FROM T_Acct_CompanyProfile c
INNER JOIN T_Inv_Order o ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 0
group by o.cust_id, c.name
这会将两个查询合并到一个结果集中。有关Union关键字的详细信息,请参阅http://www.w3schools.com/sql/sql_union.asp。
答案 2 :(得分:0)
只需使用条件聚合:
SELECT o.cust_id, UPPER(c.name),
SUM(CASE WHEN o.cod = 1 THEN 1 ELSE 0 END) as TotalCODOrders,
SUM(CASE WHEN o.cod = 0 THEN 1 ELSE 0 END) as TotalNonCODOrders
FROM T_Acct_CompanyProfile c INNER JOIN
T_Inv_Order o
ON c.id = o.cust_id
WHERE c.type_id = 1
GROUP BY o.cust_id, c.name;
如果o.cod
仅采用值0和1,那么您可以使用快捷方式:
SELECT o.cust_id, UPPER(c.name),
SUM(o.cod = 1) as TotalCODOrders,
SUM(1 - o.cod) as TotalNonCODOrders,
答案 3 :(得分:0)
使用联盟
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders'
FROM T_Acct_CompanyProfile c INNER JOIN
T_Inv_Order o
ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 1
GROUP BY o.cust_id, c.name;
UNION
SELECT o.cust_id, UPPER(c.name), count(o.order_no) AS 'Total COD Orders'
FROM T_Acct_CompanyProfile c INNER JOIN
T_Inv_Order o
ON c.id = o.cust_id
WHERE c.type_id = 1 AND o.cod = 0
GROUP BY o.cust_id, c.name;