Пользовательское предложение SQL GROUP BY - PullRequest
3 голосов
/ 26 января 2012

У меня очень настраиваемый SQL-запрос, который мне не удается реализовать.Я использую SQL-Server-2008.

У меня есть только одна таблица в этом запросе, но я ищу очень конкретные данные.Требования для этого запроса:

Для каждого DISTINCT PartNumber (столбец) мне нужно выбрать NEWEST (max) PO (столбец), который будет выбран.Однако есть еще один столбец с именем «Квитанция», где, если он вообще содержит значение, тогда PartNumber должен быть исключен все вместе.

Я несколько знаком с предложениями GROUP BY и CASES для выбора, но я не уверен, как связать все, что я знаю, в один рабочий запрос ...

Любая помощь очень ценится!Заранее спасибо =).

Ответы [ 4 ]

4 голосов
/ 26 января 2012
SELECT Partnumber, MAX(PO)
FROM MyTable t1
WHERE NOT EXISTS (SELECT 1
                  FROM MyTable
                  WHERE (Receipt <> '0'
                         OR Receipt <> '')
                  AND Partnumber = t1.partnumber)
GROUP BY PartNumber

NOT EXISTS здесь исключит любую строку, в которой есть номер изделия, для которого квитанция заполнена в любом месте таблицы.

2 голосов
/ 26 января 2012

Вот опция Anti-Join

SELECT t1.Partnumber, MAX(t1.PO)
FROM MyTable t1
     LEFT JOIN
      (SELECT DISTINCT PartNumber From MyTable
       WHERE  COALESCE(Receipt, '') = '') t2
     ON t1.Partnumber = t2.Partnumber
WHERE
     t2.Partnumber is null
GROUP BY t1.PartNumber
1 голос
/ 26 января 2012
SELECT MAX(PO)
FROM aTable
WHERE PartNumber NOT IN (
   SELECT PartNumber
   FROM aTable
   WHERE Receipt IS NULL
   GROUP BY PartNumber
   HAVING PartNumber IS NOT NULL /* fix */
)
GROUP BY PartNumber
0 голосов
/ 26 января 2012

Редактировать: Исходя из пояснений в комментариях, это упрощается до:

Если я правильно вас понимаю, это должно быть сделано:

SELECT MAX(PO)
FROM Table
GROUP BY PartNumber
HAVING MAX(Receipt) = 0

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

...