2016-12-14 2 views
3

Имея проблемы с форматированием этого вопроса после добавления новой информации. Я новичок в этом форуме и по-прежнему пытаюсь исправить форматирование следующей публикации.Запрос SQL Server для маркировки нескольких строк вместо одного

Хотелось бы иметь новую вариабельность для определения номеров плохих партий.

образца Таблица PRODUCE

Lot Fruit Status 
1245 Apple pass 
1245 Pear  pass 
1245 Lemon safe 
1245 Orange reject 
5542 Pear  pass 
5542 Apple safe 
9855 Apple reject 

Запрос Я хочу бы возвращать следующие данные, показывающие новую переменную, которая идентифицирует каждое вхождение пораженной номер партии.

Lot  Fruit  Status Flag 
1245 Apple pass  1 
1245 Pear  pass  1 
1245 Lemon safe  1 
1245 Orange reject 1 
5542 Pear  pass  0 
5542 Apple safe  0 
9855 Apple reject 1 

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

Новая информация: Мне понравилась элегантность «ответа на раздел» и вы хотите знать, можно ли это сделать.

В моем коде я должен найти самую раннюю и последнюю дату для данной партии. В настоящее время я делаю это с группой, где я использую функции min и max, чтобы получить ответ, после чего я оставил его обратно.

Lot Fruit  Status Date 
1245 Apple  pass 12OCT16 
1245 Pear  pass 11OCT16 
1245 Lemon  safe 23OCT16 
1245 Orange reject 12OCT16 
5542 Pear  pass 23SEP16 
5542 Apple  safe 12NOV16 
9855 Apple  reject 23NOV16 

Группа, входящая в мою программу, и объединяющая ее, затем генерирует этот результат. Для заданного количества лотов, многократно повторяющегося, у меня есть минимальная дата.

Lot Fruit  Status Date  MinDATE MaxDATE 
1245 Apple  pass 12OCT16 11OCT16 23OCT16 
1245 Pear  pass 11OCT16 11OCT16 23OCT16 
1245 Lemon  safe 23OCT16 11OCT16 23OCT16 
1245 Orange reject 12OCT16 11OCT16 23OCT16 
5542 Pear  pass 23SEP16 23SEP16 12NOV16 
5542 Apple  safe 12NOV16 23SEP16 12NOV16 
9855 Apple  reject 23NOV16 23NOV16 23NOV16 

Есть в любом случае, что «PARTION» может быть использована для получения такого рода данных вместо использования группировки?

+0

Добавьте тег для базы данных + версии. –

+0

Спасибо, я новичок здесь и все еще выясняю теги. –

ответ

1

Если ваша база данных поддерживает функции аналитики, обязательно займитесь этим запросом.

select  t.* 
      ,max(case when Status = 'reject' then 1 else 0 end) over 
      (
       partition by Lot 
      )      as flag 

from  mytable t 
; 

Если база данных не поддерживает аналитические функции, любое предложение будет делать (и Гордон был первым, чтобы дать ответ), так что только для целей обучения:

select t.*  
     ,coalesce 
     (
      (select max(1) 
      from mytable t2 
      where t2.Lot = t.Lot 
       and t2.Status = 'reject' 
      ) 
      ,0 
     ) as Flag 

from mytable t 
; 

select t.* 
     ,coalesce(f.flag,0) 

from mytable t left join (select 1 as flag) f 

     on  exists 
       (
        select null 
        from mytable t2 
        where t2.Lot = t.Lot 
         and t2.Status = 'reject' 
       )  
+0

Я пробовал это в своем существующем скрипте, и он отлично работал. В конце я поеду с этим примером, потому что он не требует соединения. –

+0

Мне очень понравился ваш ответ, и это заставило меня обновить сообщение для последующего вопроса о возможностях заявления Partion. –

+0

Спасибо, как новый пользователь, я никогда не видел эту галочку. –

4

Вам нужен флаг, когда что-либо в журнале «отклоняет». Вот один метод:

select t.*, coalesce(l.flag, 0) as flag 
from t left join 
    (select lot, 1 as flag 
     from t 
     where status = 'reject' 
     group by lot 
    ) l 
    on t.lot = l.lot; 
+0

Это сработало отлично. Я попытался использовать группу по жребию, прежде чем публиковать этот вопрос и не смог заставить внешний оператор распознать внутреннее созданное поле. Это хороший пример того, насколько важно «объединиться». Спасибо за вашу помощь. –

+0

Я буду использовать ваш пример «coalesce» во многих будущих проектах, зная, как получить внутреннее имя для распространения до внешнего утверждения с помощью «coalesce». –

Смежные вопросы