Суммирование данных по двум строкам с одинаковым идентификатором - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь суммировать столбец «Количество» в нашей базе данных всякий раз, когда идентификатор элемента либо сам, либо сам по себе с нулем впереди (в данном случае, например, это идентификатор 2447 или 02447):

Я начал со следующего, чтобы получить суммы идентификаторов:

SELECT
"TJ_TransactionJournalDetail"."TLI_ScanCode" As LineItemID,
"TJ_StockInventory"."INV_ScanCode" As InventoryID,
"TJ_TransactionJournalDetail"."TLI_ReceiptAlias" As ReceiptAlias,
"TJ_StockInventory"."INV_Name" As ItemName,
"TJ_TransactionJournalDetail"."TLI_LIT_FK" As LineDiscount,
SUM("TJ_TransactionJournalDetail"."TLI_Quantity") AS Quantity

FROM "TJ_StockInventory" LEFT OUTER JOIN "TJ_TransactionJournalDetail" ON "TJ_StockInventory"."INV_PK" = "TJ_TransactionJournalDetail"."INV_PK"
WHERE ecrs.TJ_TransactionJournalDetail.TLI_StartTime > '2020-01-17 00:00:00.000'

AND ecrs.TJ_TransactionJournalDetail.TLI_EndTime < '2020-01-19 23:59:59.999'
AND INV_DPT_FK = 49
AND "TJ_TransactionJournalDetail"."TLI_LIT_FK" = 1
GROUP BY LineItemID,InventoryID,ReceiptAlias,ItemName,LineDiscount
ORDER BY InventoryID;

Вот результаты, количество которых я пытаюсь объединить:

LineItemID,InventoryID,ReceiptAlias,ItemName,LineDiscount,Quantity
    '2447','02447         ','DELI-BEAR CLAW EA','Bear Claw',1,1.0000
    '02447','02447         ','DELI-BEAR CLAW EA','Bear Claw',1,30.0000

Что я ищу:

'2447','02447         ','DELI-BEAR CLAW EA','Bear Claw',1,31.0000

-или-

'02447','02447         ','DELI-BEAR CLAW EA','Bear Claw',1,31.0000

, пока количество равно 31.

Я в основном хочу объединить количество из двух строк, если LineItemID совпадает с «0», сцепленным с LineItemID в другой строке. Или другой способ сделать это - объединить все элементы с одним и тем же InventoryID, но он находится в таблице StockInventory, а не в таблице TransactionJournal, в которой есть сумма, которую я суммирую.

И попытался число решений, сначала я попробовал оператор CASE, но не смог понять, как применить его к строкам:

....
SUM (
    CASE WHEN ( "TJ_StockInventory"."INV_ScanCode" = STRING('0',"TJ_TransactionJournalDetail"."TLI_ScanCode",'         ') )
        THEN "TJ_TransactionJournalDetail"."TLI_Quantity"
        ELSE 0 END
    ) AS Quantity
FROM "TJ_StockInventory" LEFT OUTER JOIN     
....

Я также попытался разбить по ItemID, чтобы объединить количество, когда InventoryID были одинаковыми:

....
SUM("TJ_TransactionJournalDetail"."TLI_Quantity") over (partition by "TJ_StockInventory"."INV_ScanCode") AS Quantity
....

Но ни одно из этих решений не сработало. Я выбрал «иначе 0» в регистре только для того, чтобы сузить его до этого одного элемента, но во всех случаях он разделял строки и не объединял количества.

Я рассмотрел ряд учебные пособия, но, похоже, ни один из них не касается этого конкретного случая c, и я не нашел ничего, что намекало бы на решение для этого. При этом мне иногда трудно сосредоточиться на программировании баз данных, и я открыт для мысли, что, возможно, я неправильно подхожу к этому.

Несколько примеров псевдокода того, что я ищу

if LineItemID of this row = CONCAT('0', LineItemID) of another row
then sum the quantities of those rows

-или-

if InventoryID of this row and InventoryID of another row are equal
then sum them even if the LineItemIDs are different

Любая помощь, указатели или указания к примерам или документам в Интернете, которые могут помочь с этим, будут великолепны!

Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

Вы, похоже, хотите удалить "LineItemID" из агрегата:

SELECT MAX(tjd."TLI_ScanCode") As LineItemID,
       si."INV_ScanCode" As InventoryID,
       tjd."TLI_ReceiptAlias" As ReceiptAlias,
       si."INV_Name" As ItemName,
       tjd."TLI_LIT_FK" As LineDiscount,
       SUM(tjd."TLI_Quantity") AS Quantity
FROM "TJ_StockInventory" si LEFT OUTER JOIN 
     "TJ_TransactionJournalDetail" tjd
     ON si."INV_PK" = tjd."INV_PK"
WHERE tjd.TLI_StartTime > '2020-01-17' AND
      tjd.TLI_EndTime < '2020-01-20' AND
      INV_DPT_FK = 49 AND 
      tjd."TLI_LIT_FK" = 1
GROUP BY InventoryID, ReceiptAlias, ItemName, LineDiscount
ORDER BY InventoryID;
...