MySQL: условия соединения на основе таблицы для последующего соединения - PullRequest
0 голосов
/ 24 августа 2018
SELECT
    p.Sku,
    p.Barcode,
    s.AmountIncl,

    CASE
        WHEN SUM(dl.Qty) IS NULL THEN 0
        ELSE SUM(dl.Qty)
    END AS Qty,

    CASE
        WHEN SUM(dl.SubTotal) IS NULL THEN 0
        ELSE SUM(dl.SubTotal)
    END AS SubTotal

FROM
    Product AS p

        LEFT JOIN
    DocumentLine AS dl ON p.Sku = dl.Sku

        LEFT JOIN
    Document AS d ON dl.DocumentId = d.DocumentId
        AND d.DocumentTypeEnum = 'Order'
        AND d.PaymentStatusEnum = 'Paid'

        LEFT JOIN
    StandardPrice AS s ON p.ProductId = s.ProductId

WHERE
    p.Barcode IS NOT NULL

GROUP BY p.Sku

Я пытаюсь получить цифры Кол-во и Итого, сгруппированные по Sku для заказов, которые фактически были оплачены. Эти заказы могут быть идентифицированы в таблице документа с помощью условий (d.DocumentTypeEnum = 'Order' & d.PaymentStatusEnum = 'Paid'). Финансовые данные (Qty & SubTotal) находятся в DocumentLine.

Как исключить заказы / данные в таблице DocumentLine, которые связаны с документом (связанным через DocumentId), где DocumentTypeEnum НЕ является «заказом», а PaymentStatusEnum НЕ «оплачен»?

На данный момент DocumentLine включает в себя оплаченные заказы, неисполненные заказы, неоплаченные заказы, отложенные заказы, корзины и т. Д. Таким образом, данные Qty и SubTotal намного выше, чем мы фактически продали / сгенерировали.

ПРИМЕЧАНИЕ. Я все еще хочу показать все Sku, ГДЕ НЕ БЫЛ НОМЕР. Таким образом, если для Sku нет даты в DocumentLine, значения Qty и SubTotal должны быть 0?

Я запрашиваю в MySQL

Пример данных

Product
Sku | Barcode
1   | A
2   | B
3   | 
4   | C
5   |
6   | D

DocumentLine
Sku | Qty | SubTotal | DocumentId
1   | 1   | 100      | 123
2   | 1   | 150      | 124
4   | 2   | 400      | 125
6   | 1   | 120      | 128
1   | 2   | 200      | 129
4   | 1   | 200      | 131
3   | 1   | 600      | 127

Document
DocumentId | DocumentTypeEnum | PaymentStatusEnum
123        | Order            | Paid
124        | Cart             | NotApplicable
125        | Order            | Pending
126        | Cart             | NotApplicable
127        | Cart             | NotApplicable
128        | Order            | Failed
129        | Order            | Paid
130        | Cart             | NotApplicable
131        | Order            | Paid

Result:
Sku | Barcode | AmountIncl | Qty | SubTotal
1   | A       | 50         | 3   | 300
2   | B       | 60         | 0   | 0
4   | C       | 40         | 1   | 200
6   | D       | 80         | 0   | 0

Ответы [ 3 ]

0 голосов
/ 24 августа 2018
    SELECT p.Sku, p.Barcode, s.AmountIncl, 
                CASE WHEN SUM(doc.Qty) IS NULL THEN 0
                ELSE SUM(doc.Qty)
            END AS Qty,
            CASE WHEN SUM(doc.SubTotal) IS NULL THEN 0
                ELSE SUM(doc.SubTotal)
            END AS SubTotal
        FROM Product AS p
           LEFT JOIN (Select dl.sku as sku, dl.qty as qty, dl.subtotal as subtotal 
               from DocumentLine dl, Document d where dl.DocumentId = d.DocumentId
              AND d.DocumentTypeEnum = 'Order' AND d.PaymentStatusEnum = 'Paid') AS doc 
              ON p.Sku = doc.Sku
           LEFT JOIN StandardPrice AS s ON p.ProductId = s.ProductId

        WHERE p.Barcode IS NOT NULL
GROUP BY p.Sku
0 голосов
/ 24 августа 2018

Вы можете попробовать это.просто используйте LEFT JOIN базу на Product таблице и фильтр Barcode, который вы хотите получить.с функцией агрегата условия, чтобы сделать это.

CREATE TABLE Product(
   Sku INT,
   Barcode VARCHAR(10)
);



INSERT INTO Product VALUES (1,'A');
INSERT INTO Product VALUES (2,'B');
INSERT INTO Product VALUES (3,'');
INSERT INTO Product VALUES (4,'C');
INSERT INTO Product VALUES (5,'');
INSERT INTO Product VALUES (6,'D');


CREATE TABLE DocumentLine(
   Sku INT,
   Qty INT,
  SubTotal INT,
  DocumentId INT
);



INSERT INTO DocumentLine VALUES (1, 1, 100,123);
INSERT INTO DocumentLine VALUES (2, 1, 150,124);
INSERT INTO DocumentLine VALUES (4, 2, 400,125);
INSERT INTO DocumentLine VALUES (6, 1, 120,128);
INSERT INTO DocumentLine VALUES (1, 2, 200,129);
INSERT INTO DocumentLine VALUES (4, 1, 200,131);
INSERT INTO DocumentLine VALUES (3, 1, 600,127);


CREATE TABLE Document(
   Sku INT,
   DocumentTypeEnum VARCHAR(50),
  PaymentStatusEnum VARCHAR(50)
);


INSERT INTO Document VALUES (123 ,'Order',  'Paid');
INSERT INTO Document VALUES (124 ,'Cart',  'NotApplicable');
INSERT INTO Document VALUES (125 ,'Order',  'Pending');
INSERT INTO Document VALUES (126 ,'Cart',  'NotApplicable');
INSERT INTO Document VALUES (127 ,'Cart',  'NotApplicable');
INSERT INTO Document VALUES (128 ,'Order',  'Failed');
INSERT INTO Document VALUES (129 ,'Order',  'Paid');
INSERT INTO Document VALUES (130 ,'Cart',  'NotApplicable');
INSERT INTO Document VALUES (131 ,'Order',  'Paid');

Запрос 1 :

select 
  p.sku,
  Barcode,
  SUM(case when DocumentTypeEnum = 'Order' and PaymentStatusEnum = 'Paid' then Qty  else 0 end) 'Qty',
  SUM(case when DocumentTypeEnum = 'Order' and PaymentStatusEnum = 'Paid' then SubTotal  else 0 end) 'SubTotal'  
from product p 
left join DocumentLine dl on dl.sku = p.sku
left join Document d on dl.DocumentId = d.Sku
WHERE Barcode <> '' OR Barcode IS NOT NULL
group by p.sku,Barcode

Результаты :

| sku | Barcode | Qty | SubTotal |
|-----|---------|-----|----------|
|   1 |       A |   3 |      300 |
|   2 |       B |   0 |        0 |
|   4 |       C |   1 |      200 |
|   6 |       D |   0 |        0 |
0 голосов
/ 24 августа 2018

Если вы не хотите, чтобы в документе не было заказов и платных, используйте INNER JOIN для документа, а не левого соединения

SELECT p.Sku
  , p.Barcode
  , s.AmountIncl
  , CASE WHEN SUM(dl.Qty) IS NULL THEN 0
        ELSE SUM(dl.Qty)
    END AS Qty
  , CASE WHEN SUM(dl.SubTotal) IS NULL THEN 0
        ELSE SUM(dl.SubTotal)
    END AS SubTotal
FROM Product AS p
LEFT JOIN DocumentLine AS dl ON p.Sku = dl.Sku
INNER JOIN Document AS d ON dl.DocumentId = d.DocumentId
    AND d.DocumentTypeEnum = 'Order'
      AND d.PaymentStatusEnum = 'Paid'
LEFT JOIN StandardPrice AS s ON p.ProductId = s.ProductId
WHERE p.Barcode IS NOT NULL

GROUP BY p.Sku
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...