2015-06-15 1 views
0

Я хочу задать один из предложений по выбору customer id, cus_name, Total COD Orders. Я сделал эти два запроса, но эти запросы вычисляют COD и NON COD отдельно. Как я делаю один запрос, используя sub-запрос.Запрос на выбор идентификатора, имя, стоимость доставки по подзапросу

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

SQL SERVER 2008 –

ответ

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 

Это приведет два запроса к одному набору результатов. См. http://www.w3schools.com/sql/sql_union.asp для получения дополнительной информации о ключевом слове Union.

+0

Я пытаюсь это ваш UNOIN в коде, как вы описали, но это дает ошибку, как указано ниже: «Msg 8120, уровень 16, состояние 1, строка 1 Колонка" T_Inv_Order.cust_id 'недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. " –

+0

Я сделал редактирование, которое включало первую группу, так как я случайно пропустил ее. Вы пробовали это с группой в обоих разделах выбора? –

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, 
0

Использование 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; 
+0

Я бы использовал союз все, так как вам не нужен отдельный, и я бы добавил 'o.cod', чтобы узнать, какой счет является –

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 
Смежные вопросы