2013-08-08 2 views
2

У меня есть этот запрос:несколько результатов запроса в одной таблице

select sum(QTYINSTOCK * AVGPRICE) as Albums 
from inventoryinfo 
WHERE Category = 'Albums' 

Она возвращает:

Albums 
$660.80 

Есть ли способ для меня, чтобы запустить несколько запросов в одном запросе и вернуться в одной таблице ? Например:

select sum(QTYINSTOCK * AVGPRICE) as Albums from inventoryinfo 
WHERE Category = 'Albums' 
select sum(QTYINSTOCK * AVGPRICE) as Prints from inventoryinfo 
WHERE Category = 'Prints' 
select sum(QTYINSTOCK * AVGPRICE) as Frames from inventoryinfo 
WHERE Category = 'Frames' 


Albums | $660.80 
Prints | $123.00 
Frames | $67.00 

====== выглядит как консенсус, чтобы использовать объединение Результаты не совсем форматированный, как хотелось бы, он возвращает

Albums 
660.80 
123.00 
67.00 
+5

Какого-то консенсус UNION, но правильный ответ GROUP BY – Brad

+4

прав, поскольку это совокупность участвует, то 'версия UNION ALL' будет выполнять три сканирования (или сканирование диапазона переодетого индекс ищет), и версии 'UNION' могут добавить расточительный различный вид. Решение «GROUP BY» - это то, что вы должны использовать, потому что (а) оно намного проще и не избыточно, и (б) почти гарантированно работает лучше. –

ответ

11

Просто используйте GROUP BY:

select Category, sum(QTYINSTOCK * AVGPRICE) as Total from inventoryinfo 
WHERE Category IN ('Albums', 'Prints', 'Frames') 
GROUP BY Category 

или если вы хотите результаты в нескольких столбцов:

select 
    SUM(CASE WHEN Category ='Albums' THEN QTYINSTOCK * AVGPRICE ELSE 0 END) as Albums END 
    SUM(CASE WHEN Category ='Prints' THEN QTYINSTOCK * AVGPRICE ELSE 0 END) as Prints END 
    SUM(CASE WHEN Category ='Frames' THEN QTYINSTOCK * AVGPRICE ELSE 0 END) as Frames END 
FROM inventoryinfo 
WHERE Category IN ('Albums', 'Prints', 'Frames') 
GROUP BY Category 
+6

+1 для реализации этого можно легко сделать в одном запросе без UNION – Taryn

+7

+1 для использования WHERE вместо серии UNION. Все остальные ответы следует игнорировать. –

+4

@ Declan_K на яркой стороне, есть много кандидатов на значок равного уровня: D – swasheck

0

Вы могли бы использования a Union для этого. Имейте в виду, что каждый выбор должен возвращать одинаковое количество столбцов, если позже вы решите добавить дополнительные столбцы в свои результаты.

select sum(QTYINSTOCK * AVGPRICE) as Albums, 'Albums' as Type from inventoryinfo 
WHERE Category = 'Albums' 
UNION ALL 
select sum(QTYINSTOCK * AVGPRICE) as Prints ,'Prints' as Type from inventoryinfo 
WHERE Category = 'Prints' 
UNION ALL 
select sum(QTYINSTOCK * AVGPRICE) as Frames,'Frames' as Type from inventoryinfo 
WHERE Category = 'Frames' 
+0

Это близко, он возвращается в следующем формате: Альбомы
660,80
123,00
67,00 – JeffreyLazo

+2

Я хотел бы использовать решение, предложенное Д. Стэнли. Это намного проще, а не так же избыточно, как использование объединения –

-2

Оператор союз:

select "ten", 10 
union 
select "twenty", 20 
union 
select "thirty", 30 

производит

ten | 10 
twenty | 20 
thirty | 30 
Смежные вопросы