2016-03-23 6 views
4

у меня есть со стола в базе данных:Один SQL суммировать различные «группы по» уровням

enter image description here

на основе данных фондовой таблицы, я хочу иметь в качестве выходного более подробные данные:

enter image description here

Stock Кол-во представляет собой общее Количество в наличии для товара А.

Место Кол-во представляет полн al qty для позиции A для каждого местоположения

Sub Location Qty представляет общее количество элементов для элемента A для определенного места для каждого местоположения.

Мне было интересно, есть ли способ получить подробный вывод в одном запросе или я должен сделать каждый запрос индивидуально и написать код для объединения каждого результата.

Я мог бы написать:

  • Для того, чтобы получить Stock Кол-во:

    SELECT Item, Sum(Qty) as StockQty 
    From Stock 
    Group By Item; 
    
  • Для того, чтобы получить Место Кол-во:

    SELECT Item, Location, Sum(Qty) as LocationQty 
    From Stock 
    Group By Item, Location; 
    
  • Для того, чтобы get Sub Местоположение Кол-во:

    SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
    From Stock 
    Group By Item, Location, SubLocation; 
    

А потом в коде позади, написать код для вывода в DataGridView.

Фактически, я ищу запрос, который возвращает все данные в одном datatable и привязывает его к datagridview.

Любое другое решение приветствуется.

Я работаю в AS400, но если есть решение в других СУБД, пожалуйста, ответьте, я постараюсь заставить его работать (если возможно) в моей среде СУБД.

+1

Используемый тег dbms, ответ может зависеть от него. – jarlh

+0

Я отметил значок ibm-midrange для AS400. – ehh

+0

Итак, DB2 - это dbms? – jarlh

ответ

4

Попробуйте это:

SELECT t3.Item, t3.StockQty, 
     t2.Location, t2.LocationQty, 
     t1.SubLocation, t1.SubLocationQty 
FROM (
    SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
    From Stock 
    Group By Item, Location, SubLocation) AS t1 
JOIN (
    SELECT Item, Location, Sum(Qty) as LocationQty 
    From Stock 
    Group By Item, Location 
) AS t2 ON t1.Item = t2.Item AND t1.Location = t2.Location 
JOIN (
    SELECT Item, Sum(Qty) as StockQty 
    From Stock 
    Group By Item 
) AS t3 ON t1.Item = t3.Item 
+0

спасибо, просто закончите, чтобы проверить его, он отлично работает. – ehh

0

Для этого можно использовать несколько подзапросов.

SELECT Item, 
(SELECT StockQty 
FROM (SELECT Item, Sum(Qty) AS StockQty 
     FROM Stock 
     GROUP BY Item)) AS StockQty 
(SELECT LocationQty 
FROM (SELECT Item, Location, Sum(Qty) AS LocationQty 
     FROM Stock 
     GROUP BY Item, Location)) AS LocationQty, 
(SELECT SubLocationQty 
FROM (SELECT Item, Location, SubLocation, Sum(Qty) AS SubLocationQty 
     FROM Stock 
     GROUP BY Item, Location, SubLocation)) AS SubLocationQty 
FROM Stock 
+0

Вам нужны коррелированные подзапросы, без группы. – jarlh

4

как насчет:

SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
From Stock 
Group By Item, Location, SubLocation with rollup 

если у вас есть накопительный пакет в РСУБД это действительно просто. просто замените «нуль», который вы получите со строкой «Всего», и вы свободны от дома .....

+0

Вы можете подумать о том, каким будет результат. Так как это немного отличается от примера, который запросил OP. Я думаю, что это лучший выбор, но OP не может. «ROLLUP» доступен в текущей версии DB2 для IBM i. – Charles

+0

Согласовано. Если бы ОП предоставил нам эффективный пример. Я могу дать что-то, конечно, но не знаю, если это интересно. –

Смежные вопросы