2014-10-29 2 views
1

У меня есть запрос sql, который возвращает таблицу результатов с идентификаторами, Qtys и местоположениями. Элемент может быть в нескольких местах, поэтому может быть четыре строки для одного элемента, каждая строка которого является его собственным местоположением со своим собственным количеством. Пример:Подведение итогов Qty с идентификатором соответствия в нескольких строках SQL

SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION 
FROM Workshop w 
LEFT OUTER JOIN ITEM_LIST i 
ON i.ITEM_ID = w.ITEM_ID 
GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOACTION 

Возвращает:

----------------------------------- 
| ITEM_NO | QTY | LOCATION | 
----------------------------------- 
| SN-15 | 0 | SEA  | 
----------------------------------- 
| SN-15 | 2 | SFO  | 
----------------------------------- 
| TY-14 | 1 | SEA  | 
----------------------------------- 
| TY-14 | 5 | LAX  | 
----------------------------------- 
| TY-14 | 0 | SFO  | 
----------------------------------- 

То, что я хочу сделать, в идеале в этом же запросе, является сумма кол-во каждого местоположения, чтобы найти общее Qty для каждой ITEM_NO с таблицей результатов выглядит как :

--------------------------- 
| ITEM_NO | TOTAL_QTY | 
--------------------------- 
| SN-15 |  2  | 
--------------------------- 
| TY-14 |  6  | 
--------------------------- 

Что было бы лучшим способом сделать это, и смог ли я сделать все это в одном запросе? Благодаря!

+0

Если вы хотите суммировать количество различной локализации же Номер элемента, чем колонки места следует избегать и простой группы по by item_no и sum (qty) будут работать, но если вам требуется местоположение, но, если вы суммируете количество разных мест в одном и том же item_no, у вас будет такое же. строк, как в таблице 1 вашего вопроса. Вы этого хотите? –

ответ

1
SELECT ITEM_NO, SUM(TOTAL_QTY) AS TOTAL_QTY FROM tablename GROUP BY ITEM_NO 

GROUP BY разделит результаты на ITEM_NO ... это может показаться немного запутанным, но имеет смысл.

EDIT: после дополнительного вопроса

SELECT ITEM_NO, SUM(TOTAL_QTY) AS TOTAL_QTY FROM 
(
    SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION 
    FROM Workshop w 
    LEFT OUTER JOIN ITEM_LIST i 
    ON i.ITEM_ID = w.ITEM_ID 
    GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOACTION 
) AS query1 
GROUP BY ITEM_NO 

Что вы делаете здесь, используя результаты запроса, сделанного в виде таблицы для запроса суммы с. Каждый результат запроса может использоваться так, как если бы он был таблицей в базе данных.

+0

Итак, я вижу, как это работает, но могу ли я объединить это с исходным запросом результатов в один запрос? Я добавил исходный запрос, который возвращает первую таблицу результатов в вопрос вверху. Есть ли способ вложить это решение в исходный запрос, чтобы его можно было сделать все сразу? Или мне придется запускать несколько запросов? Благодаря! – tsHunter

+0

Я только что отредактировал свой ответ с тем, что вам нужно ... сообщите мне, если вы все еще что-то не замечаете. – Dominique

1

Это базовый запрос агрегирования. Если вы собираетесь эффективно использовать SQL, вы должны изучить основы языка:

select t.item_no, sum(t.qty) as total_qty 
from table t 
group by t.item_no; 

group by является фундаментальной частью языка.

EDIT:

Конечно. Самый простой способ заключается в использовании with:

with t as (
     SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION 
     FROM Workshop w LEFT OUTER JOIN 
      ITEM_LIST i 
      ON i.ITEM_ID = w.ITEM_ID 
     GROUP BY i.ITEM_NO, w.QTY_ON_HAND, w. QTY_DAMAGED, w.LOCATION 
    ) 
select t.item_no, sum(t.qty) as total_qty 
from table t 
group by t.item_no; 

Но этот запрос не имеет смысла. Вам не нужны эти две величины в group by. Итак, попробуйте следующее:

with t as (
     SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY, w.LOCATION 
     FROM Workshop w LEFT OUTER JOIN 
      ITEM_LIST i 
      ON i.ITEM_ID = w.ITEM_ID 
     GROUP BY i.ITEM_NO, w.LOCATION 
    ) 
select t.item_no, sum(t.qty) as total_qty 
from table t 
group by t.item_no; 

И дальнейшее упрощение просто:

 SELECT i.ITEM_NO, SUM(w.QTY_ON_HAND - w.QTY_DAMAGED) as QTY 
     FROM Workshop w LEFT OUTER JOIN 
      ITEM_LIST i 
      ON i.ITEM_ID = w.ITEM_ID 
     GROUP BY i.ITEM_NO 
+0

Почему вы добавляете псевдоним к таблице, если вы никогда не используете его? – Dominique

+0

@ Dominique. , , Я почти всегда добавляю псевдонимы. –

+0

Я добавляю их только тогда, когда я присоединяюсь к столам ... но когда я их добавляю, я также их использую. Теперь псевдоним добавлен для использования вообще ...на серверах с высоким трафиком каждая микросекунда рассчитывает. – Dominique

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