2017-01-24 11 views
1
FoxPro

У меня есть 2 таблицыСкрипт для сравнения и просуммировать две таблицы

товара Таблица

ItemCode  BatchNumber Qty 
Item01  Batch1   50 
Item02  Batch2   75 

Transaction Таблица

ItemCode  BatchNumber QtyUsed 
Item01  Batch1   4 
Item02  Batch2   7 

Желаемая Выход

ItemCode  BatchNumber Qty QtyUsed Balance 
Item01  Batch1   50  4  46 
Item02  Batch2   75  7  68 

Какой сценарий sql для достижения этого результата?

ответ

3

Это должно получить его для вас. Трюк состоит в том, чтобы предварительно запросить каждый набор, так что, самое большее, у вас есть одна запись за элемент/комбинацию пакетов. Если нет, и у вас есть несколько в любой таблице, вы получите декартовский результат. Начиная с таблицы элементов, они гарантированно имеют запись, тогда как таблица транзакций может никогда не продавать указанный элемент. Таким образом сначала выполняется предварительный запрос запроса, затем сравнивается сумма всех транзакций, имеющих не более 1: 1 отношение записи. Но если нет соответствующих транзакций для элемента/партии, NVL() вернет нулевое значение, но я установил значение 000000, поэтому, если первая запись имеет нулевое значение, вы не получите ответ на один столбец ширины столбца, с одним 0.

select; 
     TmpItem.ItemCode,; 
     TmpItem.BatchNumber,; 
     TmpItem.SumQ as Qty,; 
     cast(NVL(TmpTrans.SumUsed, 0) as int) as QtyUsed,; 
     TmpItem.SumQ - NVL(TmpTrans.SumUsed, 0) as Balance; 
    from ; 
     (select ItemCode, BatchNumber, SUM(Qty) as SumQ; 
      FROM ItemTable; 
      GROUP BY 1, 2) TmpItem; 
      LEFT JOIN; 
      (select ItemCode, BatchNumber, SUM(QtyUsed) as SumUsed; 
       FROM TransTable; 
       GROUP BY 1, 2) TmpTrans; 
      ON TmpItem.ItemCode = TmpTrans.ItemCode; 
      AND TmpItem.BatchNumber = TmpTrans.BatchNumber 
+0

Я думаю, что это будет лучший подход к отливать() результат. т. е .: cast (NVL (TmpTrans.SumUsed, 0) as int) как QtyUsed –

1

Вот еще один способ. Объедините обе таблицы с помощью инструкции UNION. Таким образом, у вас есть все ваши записи в одном курсоре/таблице. Во втором выступлении вы можете сделать свой GROUP BY, чтобы получить итоговые значения для полей Qty, QtyUsed и Balance.

Иногда расщепление работы на более мелкие операторы выбора может затруднить задачу.

SELECT i.ItemCode, i.BatchNumber, i.Qty, 0000 as QtyUsed ; 
    FROM Item i ; 
UNION ; 
SELECT t.ItemCode, t.BatchNumber, 0000 as Qty, t.QtyUsed ; 
    FROM Transaction t ; 
    INTO CURSOR one 

SELECT ItemCode, BatchNumber, SUM(Qty) as Qty, SUM(QtyUsed) as QtyUsed, (SUM(Qty) - SUM(QtyUsed)) as Balance ; 
    FROM one ; 
    INTO CURSOR two ; 
    GROUP BY ItemCode, BatchNumber 
0

Просто:

SELECT a.ItemCode, a.BatchNumber, a.Qty 
     b.QtyUsed, a.Qty - b.QtyUsed as Balance 
    FROM ItemTable a 
    LEFT JOIN TransactionTable b ON a.ItemCode = b.ItemCode 
          and a.BatchNumber = b.BatchNumber 

Конечно, если и Артикул BatchNumber различны