Оператор Oracle SELECT с GROUP BY и несколькими предложениями WHERE - PullRequest
0 голосов
/ 24 мая 2018

У меня проблемы с запросом выбора.Смотрите пример данных ниже.Я хочу выбрать записи Sku, в которых нет количества запаса для идентификатора склада 1, но есть количество запаса для идентификатора склада 2 и 3. Не уверены, что я делаю неправильно?

SAMPLE TABLEДАННЫЕ

Sku         WhseId      Qty
============================
ABC-123     1           6
ABC-123     2           3
ABC-123     3           2
XYZ-789     1           0
XYZ-789     2           1
XYZ-789     3           3
DEF-456     1           0
DEF-456     2           0
DEF-456     3           3

QUERY

SELECT Sku, WhseId, Qty
FROM PRODUCTS
WHERE (WhseId = 1 AND Qty < 1)
AND (WhseId = 2 AND Qty > 0
AND (WhseId = 3 AND Qty > 0)
GROUP BY Sku, WhseId, Qty

Желаемый результат

Sku         WhseId      Qty
============================
XYZ-789     1           0
XYZ-789     2           1
XYZ-789     3           3

Ответы [ 6 ]

0 голосов
/ 24 мая 2018

Как насчет объединения IN с GROUP BY в Sku?

SELECT Sku, WhseId, Qty
FROM PRODUCTS
WHERE Sku IN ( 
   SELECT Sku
   FROM PRODUCTS
   WHERE WhseId IN (1, 2, 3)
   GROUP BY Sku
   HAVING MAX(CASE WHEN WhseId = 1 THEN Qty END) = 0
      AND MAX(CASE WHEN WhseId = 2 THEN Qty END) > 0
      AND MAX(CASE WHEN WhseId = 3 THEN Qty END) > 0
)
ORDER BY Sku, WhseId;

Результат:

Sku     WhseId Qty
------- ------ ---
XYZ-789      1   0
XYZ-789      2   1
XYZ-789      3   3

SQL Fiddle

0 голосов
/ 24 мая 2018

Простое решение:

select sku, whseid, qty
from etst
where sku = 'XYZ-789' and ((whseid = 1 and qty < 1)
or (whseid = 2 and qty > 0)
or (whseid = 3 and qty > 0))
group by sku, whseid, qty;
0 голосов
/ 24 мая 2018
CREATE VIEW get_skus_2 AS
SELECT Sku
FROM PRODUCTS
WHERE Qty>0 AND WhseId=2;

CREATE VIEW get_skus_3 AS
SELECT Sku
FROM PRODUCTS
WHERE Qty>0 AND WhseId=3;

SELECT Sku s, WhseId, Qty
FROM get_skus_2 g2 JOIN get_skus_3 g3 ON g2.Sku = g3.Sku
WHERE s IN (
    SELECT Sku
    FROM PRODUCTS
    WHERE Qty=0 AND WhseId=1);
0 голосов
/ 24 мая 2018
SELECT
   Sku,
   WhseId,
   Qty
FROM
(
   SELECT
      PRODUCTS.*,
      SUM(CASE WHEN WhseId = 1 THEN Qty END) OVER (PARTITION BY Sku)   AS whse1_qty,
      SUM(CASE WHEN WhseId = 2 THEN Qty END) OVER (PARTITION BY Sku)   AS whse2_qty,
      SUM(CASE WHEN WhseId = 3 THEN Qty END) OVER (PARTITION BY Sku)   AS whse3_qty
   FROM
      PRODUCTS
)
  pivotted
WHERE
      whse1_qty < 1
  AND whse2_qty > 0
  AND whse3_qty > 0
0 голосов
/ 24 мая 2018

Я думаю, что вы действительно хотите использовать EXISTS для этого:

SELECT Sku, WhseId, Qty
FROM PRODUCTS p
WHERE EXISTS
(SELECT 1
 FROM PRODUCTS p2
 WHERE p.sku = p2.sku
 AND p2.whseid = 1
 AND p2.qty = 0)
AND EXISTS
(SELECT 1
 FROM PRODUCTS p3
 WHERE p.sku = p3.sku
 AND p3.whseid = 2
 AND p3.qty > 0)
AND EXISTS
(SELECT 1
 FROM PRODUCTS p4
 WHERE p.sku = p4.sku
 AND p4.whseid = 3
 AND p4.qty > 0)
0 голосов
/ 24 мая 2018

Использовать агрегацию и предложение having:

SELECT Sku
FROM PRODUCTS
GROUP BY Sku
HAVING SUM(CASE WHEN WhseId = 1 AND Qty < 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN WhseId = 2 AND Qty > 0 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN WhseId = 3 AND Qty > 0 THEN 1 ELSE 0 END) > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...