使用子查询查询选择ID,名称,交货成本

时间:2015-06-15 11:13:50

标签: sql sql-server

我想提出一个查询来选择customer idcus_nameTotal COD Orders。我做了这两个查询,但这些查询分别计算CODNON 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;

4 个答案:

答案 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;