SQL Выберите повторяющиеся строки с конкретными значениями - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть таблица (JobLog), которая содержит данные о продуктах.Я хочу иметь возможность проверить, не были ли некоторые поля повторно отправлены и введены дважды, но, возможно, были обработаны ранее.

Мой код выглядит следующим образом:

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM 
    JobLog AS A 
    INNER JOIN (
        SELECT ProductCode, AmtHeld
        FROM JobLog GROUP BY ProductCode, AmtHeld 
        HAVING COUNT(*) > 1
    ) AS B 
        ON (A.ProductCode = B.ProductCode) 
        AND (A.AmtHeld = B.AmtHeld) 

И выводит:

|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | P          |
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | C          |
|------------|---------|-------------|------------|
| vanilla    | 355     | A30         | C          |
|------------|---------|-------------|------------|
| vanilla    | 355     | A30         | C          |
|------------|---------|-------------|------------|

Есть ли способ иметь дополнительный параметр, в котором он будет выводить только строки, в которых Disposition = P является частью строки?Например, я хотел бы получить только два шоколадных продукта, так как один из них имеет расположение Р, но не два ванильных, поскольку у них обоих есть расположение С (нет Р).

|ProductName | AmtHeld | ProductCode | Disposition|
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | P          |
|------------|---------|-------------|------------|
| chocolate  | 123     | 500         | C          |
|------------|---------|-------------|------------|

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы можете поставить условие прямо в предложении HAVING:

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A INNER JOIN 
    (SELECT ProductCode, AmtHeld
     FROM JobLog
     GROUP BY ProductCode, AmtHeld 
     HAVING COUNT(*) > 1 AND
            SUM(IIF(DISPOSITION = 'P', 1, 0)) > 0
    ) AS B
    ON A.ProductCode = B.ProductCode AND 
       A.AmtHeld = B.AmtHeld 
0 голосов
/ 13 февраля 2019

Я считаю, что ваше требование может быть выполнено без использования агрегации.Вы можете просто использовать условие WHERE EXISTS, чтобы убедиться, что для текущего кортежа ProductCode / AmtHeld имеется как минимум две записи и что одна из них имеет расположение P.

SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition
FROM JobLog AS A 
WHERE EXISTS (
    SELECT 1 FROM JobLog B
    WHERE 
        A.ProductCode = B.ProductCode 
        AND A.AmtHeld = B.AmtHeld
        AND A.Disposition <> B.Disposition
        AND (A.Disposition = 'P' OR B.Disposition = 'P') 
)

Эта БД Fiddle с вашими примерами возвращает:


| ProductName | ProductCode | AmtHeld | Disposition |
| ----------- | ----------- | ------- | ----------- |
| chocolate   | 500         | 123     | P           |
| chocolate   | 500         | 123     | C           |

0 голосов
/ 13 февраля 2019

Вы можете добавить предложение WHERE EXISTS к вашему запросу, чтобы проверить продукт, который имеет значение Disposition P где-то в таблице:

WHERE EXISTS (SELECT * 
              FROM JobLog A1
              WHERE A1.ProductCode = A.ProductCode AND A1.Disposition = 'P')

В качестве альтернативы вы можете сделать еще один самостоятельноприсоединиться:

JOIN JobLog C
ON C.ProductCode = A.ProductCode AND C.Disposition = 'P'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...