2013-02-18 3 views
1

Поскольку моя проблема несколько конкретна, я еще не нашел и не ответил после очень длинных поисков, так что вот так: у меня есть две таблицы: In_Stock и Out_Stock. Я использую следующие выбирает:
Подстановка из двух разных таблиц в SQL

in_stock:

select 
INs.CatID as CategoryID, 
INs.SubCatID as SubcategoryID, Sum(INs.Quantity) as QuantityIN 
from IN_Stock INs 
group by INs.CatID, INs.SubCatID 
╔════════════╦═══════════════╦════════════╗ 
║ CategoryID ║ SubcategoryID ║ QuantityIN ║ 
╠════════════╬═══════════════╬════════════╣ 
║   2 ║    9 ║ 0   ║ 
║   1 ║   16 ║ 8   ║ 
║   1 ║   27 ║ 5   ║ 
║   1 ║   30 ║ 160  ║ 
║   1 ║   31 ║ 6   ║ 
║   1 ║   39 ║ 35   ║ 
║   1 ║   40 ║ 7   ║ 
║   2 ║   44 ║ 13   ║ 
║   2 ║   54 ║ 6   ║ 
║   2 ║   70 ║ 5   ║ 
║   3 ║   87 ║ 3,5  ║ 
╚════════════╩═══════════════╩════════════╝ 

OUT_Stock:

select 
OUTs.CatID as CategoryID, 
OUTs.SubCatID as SubcategoryID, 
Sum(OUTs.Quantity) as QuantityOUT 
from OUT_Stock OUTs 
group by OUTs.CatID, OUTs.SubCatID 
╔════════════╦═══════════════╦═════════════╗ 
║ CategoryID ║ SubcategoryID ║ QuantityOUT ║ 
╠════════════╬═══════════════╬═════════════╣ 
║   1 ║   30 ║   30 ║ 
║   1 ║   39 ║   15 ║ 
╚════════════╩═══════════════╩═════════════╝ 

Что я получаю эту таблицу ниже (и это, очевидно, не так).

select 
INs.CatID as CategoryID, 
INs.SubCatID as SubcategoryID, 
Sum(INs.Quantity) as QuantityIN, 
SUM(OUTs.Quantity) as QuantityOUT, 
SUM(INs.Quantity)- SUM(OUTs.Quantity) as RemainingQuantity 
from IN_Stock INs 
left join OUT_Stock OUTs on INs.CatID=OUTs.CatID and INs.SubCatid=OUTs.SubCatid 
group by INs.catid, INs.subcatid 

╔════════════╦═══════════════╦═════════════╦════════════╦═══════════════════╗ 
║ CategoryID ║ SubcategoryID ║ QuantityIN ║ QuantityOUT║ RemainingQuantity ║ 
╠════════════╬═══════════════╬═════════════╬════════════╬═══════════════════╣ 
║   2 ║    9 ║ 0   ║   ║     ║ 
║   1 ║   16 ║ 8   ║   ║     ║ 
║   1 ║   27 ║ 5   ║   ║     ║ 
║   1 ║   30 ║ 320   ║  150 ║    170 ║ 
║   1 ║   31 ║ 6   ║   ║     ║ 
║   1 ║   39 ║ 35   ║   30 ║     5 ║ 
║   1 ║   40 ║ 7   ║   ║     ║ 
║   2 ║   44 ║ 13   ║   ║     ║ 
║   2 ║   54 ║ 6   ║   ║     ║ 
║   2 ║   70 ║ 5   ║   ║     ║ 
║   3 ║   87 ║ 3,5   ║   ║     ║ 
╚════════════╩═══════════════╩═════════════╩════════════╩═══════════════════╝ 

Что я хочу сделать выбор в SQL, который возвращает что-то вроде таблицы внизу ... и я хотел бы знать, если и как я могу видеть в RemaningStock collumn: где SubcategoryID = 30 и где SubCategoryID = 39.

╔════════════╦═══════════════╦════════════╦════════════╦═══════════════════╗ 
║ CategoryID ║ SubcategoryID ║ QuantityIN ║ QuantityIN ║ RemainingQuantity ║ 
╠════════════╬═══════════════╬════════════╬════════════╬═══════════════════╣ 
║   2 ║    9 ║ 0   ║   ║     ║ 
║   1 ║   16 ║ 8   ║   ║     ║ 
║   1 ║   27 ║ 5   ║   ║     ║ 
║   1 ║   30 ║ 160  ║   30 ║    130 ║ 
║   1 ║   31 ║ 6   ║   ║     ║ 
║   1 ║   39 ║ 35   ║   15 ║    20 ║ 
║   1 ║   40 ║ 7   ║   ║     ║ 
║   2 ║   44 ║ 13   ║   ║     ║ 
║   2 ║   54 ║ 6   ║   ║     ║ 
║   2 ║   70 ║ 5   ║   ║     ║ 
║   3 ║   87 ║ 3,5  ║   ║     ║ 
╚════════════╩═══════════════╩════════════╩════════════╩═══════════════════╝ 

Обе таблицы имеют одну или несколько записей для определенной категории или подкатегории
Любая помощь очень ценится. Большое спасибо!
Любой код SQL или Access VBA подходит для меня.
PS: Поскольку это мой первый пост, пожалуйста, будьте «нежными».

+0

+1 для этого табличного форматирования! – Brad

ответ

1

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

Предполагая, что это тестовые данные, например:

CREATE TABLE table_in (
    id INTEGER, 
    value INTEGER 
); 

CREATE TABLE table_out (
    id INTEGER, 
    value INTEGER 
); 

INSERT INTO table_in(id, value) VALUES 
    (1, 120), 
    (1, 10); 

INSERT INTO table_out(id, value) VALUES 
    (1, 30); 

так, как вы пишете LEFT JOIN в последнем запросе:

SELECT t1.value AS val1, t2.value AS val2 
    FROM table_in t1 LEFT JOIN table_out t2 ON t1.id=t2.id; 

будет производить эти строки, до агрегирования:

ID  VAL1  VAL2 
1  120   30 
1  10   30 

Здесь сумма затем дает следующее:

ID  SUM(VAL1) SUM(VAL2) 
1  130   60 

Это произойдет в любое время, когда для условий, используемых для соединения, существует более одной строки.

Вам необходимо выполнить объединение после совокупных операций, так как вы хотите сравнить сумму всех входов с суммой всех выходов.

Это можно сделать с помощью подзапросов или CTEs.

Например:

WITH sum_in AS (
    SELECT id, SUM(value) AS all_in 
    FROM table_in 
    GROUP BY id 
), sum_out AS (
    SELECT id, SUM(value) AS all_out 
    FROM table_out 
    GROUP BY id 
) 
SELECT t1.id, all_in, all_out, all_in - all_out 
    FROM sum_in t1 LEFT JOIN sum_out t2 ON t1.id=t2.id 
+0

'С SUM_IN AS (SELECT, INs.Catid, INs.Subcatid, SUM (INs.Quantity) AS all_in ОТ in_stock Ins GROUP BY INs.catid, INs.subcatid ), SUM_OUT AS (SELECT, OUTs.Catid, OUTs.Subcatid, СУММА (OUTs.Quantity) кАК all_out ОТ OUT_Stock OUTS GROUP BY OUTs.catid, OUTs.subcatid ) ВЫБОР T1.CatID как CategoryID, T1.SubCatID как SubcategoryID, ALL_IN как QuantityIN, aLL_OUT как QuantityOUT, ALL_IN - ALL_OUT as RemainingQuantity FROM SUM_IN T1 LEFT JOIN SUM_OUT T2 ON T1.CatID = T2.CatID и T1.SubCatID = T2.SubCatID' Работает как шарм с некоторой незначительной настройкой ... СПАСИБО ВАС ОЧЕНЬ МНОГО! –

1

Вы можете использовать подзапросы, чтобы получить то, что вы хотите, например:

SELECT * 
FROM (SELECT INs.catid   AS CategoryID, 
      INs.subcatid  AS SubcategoryID, 
      SUM(INs.quantity) AS QuantityIN 
    FROM in_stock INs 
    GROUP BY INs.catid, 
       INs.subcatid) AS a 
    LEFT JOIN (SELECT OUTs.catid   AS CategoryID, 
        OUTs.subcatid  AS SubcategoryID, 
        SUM(OUTs.quantity) AS QuantityOUT 
       FROM out_stock OUTs 
       GROUP BY OUTs.catid, 
         OUTs.subcatid) AS b 
      ON (a.subcategoryid = b.subcategoryid) 
      AND (a.categoryid = b.categoryid); 

Исходя из этого, очень легко на самом деле редактировать и изменять запрос с помощью окна конструктора запросов в MS Access

SELECT a.categoryid, 
    a.subcategoryid, 
    a.quantityin, 
    b.quantityout, 
    [quantityin] - [quantityout] AS RemainingQuantity 
FROM (SELECT INs.catid   AS CategoryID, 
      INs.subcatid  AS SubcategoryID, 
      SUM(INs.quantity) AS QuantityIN 
    FROM in_stock INs 
    GROUP BY INs.catid, 
       INs.subcatid) AS a 
    LEFT JOIN (SELECT OUTs.catid   AS CategoryID, 
        OUTs.subcatid  AS SubcategoryID, 
        SUM(OUTs.quantity) AS QuantityOUT 
       FROM out_stock OUTs 
       GROUP BY OUTs.catid, 
         OUTs.subcatid) AS b 
      ON (a.subcategoryid = b.subcategoryid) 
      AND (a.categoryid = b.categoryid); 
+0

WOW, что было быстро ... Это до сих пор ** хорошо, но актуально то, что меня интересует, это столбец RemaningQuantity. –

+0

Оставшееся количество может быть легко добавлено с помощью окна дизайна запроса. Фактически, у вас теперь есть контроль над фильтрами и полями с окном проектирования и указанным выше sql. – Fionnuala

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