SQL-запрос, в котором будут пропущены записи с одинаковым идентификатором на основе значений в другом столбце - PullRequest
0 голосов
/ 24 октября 2018

* ОБНОВЛЕНИЕ *

При дальнейшем рассмотрении используемая таблица также содержит столбец linenumber.Смотрите обновленный пример данных ниже.Я чувствую, что это может быть чрезвычайно полезно для решения этого .... просто не знаю, как.Суммируйте номер строки по PO, и если он равен 1, это отдельная строка, если он больше 1, это многострочный .... это нам что-нибудь дает?

Новое здесь ив SQL, поэтому, пожалуйста, прости мое невежество.Надеемся, что это простой ответ.

Нужно создать 3 аналогичных запроса, которые будут возвращать заказы на покупку, содержащие более 1 элемента и:

  1. Не содержать элементов, контролируемых лотом
  2. Содержит ВСЕ элементы, контролируемые лотом
  3. Содержит СМЕСЬ элементов, контролируемых лотом и не контролируемых лотом

Данные выглядят следующим образом ...

PONUMBER    ITEMNUMBER  LOTCONTROLLED  LINENUMBER
PO1.18      OSC1024     0              1
PO1.18      OSC1025     0              2
PO1.18      OSC1026     0              3
PO1.2       OSC1199     0              1
PO1.2       OSC1200     1              2
PO1.21      OSC1201     1              1
PO1.21      OSC1202     1              2
PO1.22      OSC1203     1              1
PO1.23      OSC1204     1              1
PO1.23      OSC1205     0              2
PO1.24      OSC1206     1              1
PO1.24      OSC1207     1              2
PO1.24      OSC1300     0              3

Запрос для элементов, не контролируемых лотом, прекрасно работает ...

    SELECT 
      `POD`.`PONUMBER`,
      `POD`.`ITEMNUMBER`,
      `POD`.`LOTCONTROLLED`
    FROM
      table1 AS `POD`
    INNER JOIN
      (
        SELECT `PONUMBER`, COUNT(`PONUMBER`)
        FROM table1
        WHERE `LOTCONTROLLED` = 0
        GROUP BY `PONUMBER`
        HAVING (COUNT(`PONUMBER`) > 1)
       ) as `POD1`
     ON `POD`.`PONUMBER` = `POD1`.`PONUMBER`

Я думал, что это будет так же просто, как изменить WHERE LOTCONTROLLED на = 1, чтобы получить заказы на покупку со всеми элементами, контролируемыми лотом, но этовозвращает несколько заказов на поставку, которые также имеют смешанные строки.

Как можно исключить заказ на покупку из включения, если какая-либо из строк не контролируется партиями?

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Оконные функции - самый простой метод, но у вас их, вероятно, нет.Итак, просто используйте min() и max() из lotcontrolled.Основной запрос:

select pod.* 
from table1 pod join
      (select ponumber, min(lotcontrolled) as min_lc, max(lotcontrolled) as max_lc
       from table1 pod
       group by ponumber
       having count(*) > 1
      ) p
      using (ponumber)

Тогда у вас есть три условия:

max_lc = 0  -- no lot controlled
min_lc = 1  -- all lot controlled 
min_lc <> max_lc  -- mixed

Некоторые люди могут предпочесть более подробные версии:

min_lc = max_lc and max_lc = 0  -- no lot controlled
min_lc = max_lc and max_lc = 1  -- all lot controlled 
min_lc <> max_lc  -- mixed
0 голосов
/ 24 октября 2018

Похоже, вам также нужно присоединиться к запросам по Lot Controlled, поэтому я добавил его в Group By и Inner Select, чтобы его можно было объединить:

NO LOT CONTROLLED:

SELECT 
      `POD`.`PONUMBER`,
      `POD`.`ITEMNUMBER`,
      `POD`.`LOTCONTROLLED`
    FROM
      table1 AS `POD`
    INNER JOIN
      (
        SELECT `PONUMBER`, 'LOTCONTROLLED', COUNT(`PONUMBER`)
        FROM table1
        WHERE `LOTCONTROLLED` = 0
        GROUP BY `PONUMBER`, 'LOTCONTROLLED'
        HAVING (COUNT(`PONUMBER`) > 1)
       ) as `POD1`
     ON `POD`.`PONUMBER` = `POD1`.`PONUMBER` AND `POD`.`LOTCONTROLLED` = `POD1`.`LOTCONTROLLED`

ЛОТ КОНТРОЛИРОВАНО:

SELECT 
      `POD`.`PONUMBER`,
      `POD`.`ITEMNUMBER`,
      `POD`.`LOTCONTROLLED`
    FROM
      table1 AS `POD`
    INNER JOIN
      (
        SELECT `PONUMBER`, 'LOTCONTROLLED', COUNT(`PONUMBER`)
        FROM table1
        WHERE `LOTCONTROLLED` = 1
        GROUP BY `PONUMBER`, 'LOTCONTROLLED'
        HAVING (COUNT(`PONUMBER`) > 1)
       ) as `POD1`
     ON `POD`.`PONUMBER` = `POD1`.`PONUMBER` AND `POD`.`LOTCONTROLLED` = `POD1`.`LOTCONTROLLED`

ВСЕ ЛОТ КОНТРОЛИРОВАНО:

SELECT 
      `POD`.`PONUMBER`,
      `POD`.`ITEMNUMBER`,
      `POD`.`LOTCONTROLLED`
    FROM
      table1 AS `POD`
    INNER JOIN
      (
        SELECT `PONUMBER`, 'LOTCONTROLLED', COUNT(`PONUMBER`)
        FROM table1
        WHERE `LOTCONTROLLED` IN (0,1)
        GROUP BY `PONUMBER`, 'LOTCONTROLLED'
        HAVING (COUNT(`PONUMBER`) > 1)
       ) as `POD1`
     ON `POD`.`PONUMBER` = `POD1`.`PONUMBER` AND `POD`.`LOTCONTROLLED` = `POD1`.`LOTCONTROLLED`
0 голосов
/ 24 октября 2018

попробуйте что-то вроде этого:

    --No items in the group contain LotControlled 
    SELECT * 
    FROM   your_table 
    WHERE  ponumber IN (SELECT ponumber 
                        FROM   your_table 
                        GROUP  BY ponumber 
                        HAVING Sum(CONVERT(INT, lotcontrolled)) = 0) 

    --All Items Contain 
    SELECT * 
    FROM   your_table 
    WHERE  ponumber IN (SELECT ponumber 
                        FROM   your_table 
                        GROUP  BY ponumber 
                        HAVING Sum(CONVERT(INT, lotcontrolled)) = Count(*)) 

    --mixed 
    SELECT * 
    FROM   your_table 
    WHERE  ponumber IN (SELECT ponumber 
                        FROM   your_table 
                        GROUP  BY ponumber 
                        HAVING Sum(CONVERT(INT, lotcontrolled)) != Count(*) 
                               AND Sum(CONVERT(INT, lotcontrolled)) > 0) 
0 голосов
/ 24 октября 2018

Мне нравится использовать NOT EXISTS здесь:

SELECT POD.*
FROM table1 POD
JOIN (SELECT PONUMBER
      FROM table1 POD
      WHERE NOT EXISTS (SELECT *
                        FROM table1 POD1
                        WHERE POD.PONUMBER = POD1.PONUMBER
                        AND POD1.LOTCONTROLLED = 1)
      GROUP BY PONUMBER
      HAVING COUNT(*) > 1
      ) POD1 ON POD.PONUMBER = POD1.PONUMBER

Это исключит PONUMBER из результатов, если какая-либо запись из этого PONUMBER имеет LOTCONTROLLED = 1 или 0, в зависимости от того, что выположить в существующий подзапрос.

Чтобы получить только записи, которые имеют микс, вы можете использовать COUNT().. HAVING:

SELECT PONUMBER,
       ITEMNUMBER,
       LOTCONTROLLED
FROM table1 POD
JOIN (SELECT PONUMBER
      FROM table1
      GROUP BY PONUMBER
      HAVING COUNT(DISTINCT LOTCONTROLLED) = 2
     ) POD1 ON POD.PONUMBER = POD1.PONUMBER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...