2016-12-14 28 views
3

有問題與添加新的信息後格式化這個問題。我是這個論壇的新手,仍然試圖修復下面的帖子的格式。SQL Server查詢用於標記多行,而不是一個

想有一個新的varible識別壞批號。

樣品表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 

Case語句會工作。我們不想將它們篩選出來,因爲我們有更多的字段名稱,而我只顯示前三列。

新的信息:我很喜歡「分區答案」的風采,想知道是否可以這樣做。

在我的代碼我必須找到一個給定很多的最早和最晚的日期。我目前在一個小組中使用最小和最大函數來獲得答案,然後我將它加入回來。

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 

在我的程序中使用的group by和join會生成此輸出。 對於給定的批號多次,我有最小最大日期。

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 Statement的能力的後續問題。 –

+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

這工作完美。在發佈這個問題之前,我曾嘗試過使用group by,並且無法獲得外部語句來識別內部創建的字段。這是「結合」重要性的一個很好的例子。謝謝你的幫助。 –

+0

我將在很多未來的項目中使用你的「合併」的例子,現在知道如何讓內部名稱傳播到外部語句與「合併」。 –