2016-09-15 110 views
1

同我有一個表5列如下:只顯示一個記錄,如果值在另一列SQL

 
| ID | NAME | PO_NUMBER | DATE  | STATS | 
| 1 | Jhon | 160101-001 | 2016-01-01 | 7  | 
| 2 | Jhon | 160101-002 | 2016-01-01 | 7  | 
| 3 | Jhon | 160102-001 | 2016-01-02 | 7  | 
| 4 | Jane | 160101-001 | 2016-01-01 | 7  | 
| 5 | Jane | 160102-001 | 2016-01-02 | 7  | 
| 6 | Jane | 160102-002 | 2016-01-02 | 7  | 
| 7 | Jane | 160102-003 | 2016-01-02 | 7  | 

我需要顯示所有的值,但statsdate場根據域,但沒有重複。
像這樣

 
| ID | NAME | PO_NUMBER | DATE  | STATS | 
| 1 | Jhon | 160101-001 | 2016-01-01 | 7  | 
| 2 | Jhon | 160101-002 | 2016-01-01 | null | 
| 3 | Jhon | 160102-001 | 2016-01-02 | 7  | 
| 4 | Jane | 160101-001 | 2016-01-01 | 7  | 
| 5 | Jane | 160102-001 | 2016-01-02 | 7  | 
| 6 | Jane | 160102-002 | 2016-01-02 | null | 
| 7 | Jane | 160102-003 | 2016-01-02 | null | 

我有麻煩了希望。謝謝

+0

例如日期2016年1月1日是三次重複的例子是正確的。 。 –

+0

你正在使用什麼版本的SQL Server? – Squirrel

+0

@sandeeprawat是,日期字段重複值 – Ricky

回答

2

從您的示例數據看來,您只希望顯示statspo_number結尾爲001。如果是的話,這應該是最簡單的方法:

select id, name, po_number, date, 
     case when right(po_number, 3) = '001' then stats else null end as stats 
from yourtable 

相反,如果你想order bypo_number,那麼這裏使用row_number一個選項:

select id, name, po_number, date, 
     case when rn = 1 then stats else null end as stats 
from (
    select *, row_number() over (partition by name, date order by po_number) as rn 
    from yourtable 
) t 
由於您使用的是SQL 2012,因此請使用
+0

是,例如,在這個'po_number'已經結束同001,但我已經表現出從'date'根據,是不可能的? – Ricky

+1

@Ricky - 第二個例子就是這樣。看到小提琴:http://sqlfiddle.com/#!15/cc259/2 – sgeddes

+0

感謝@sgeddes,我很感激你 – Ricky

0

,你可以使用LEAD()或LAG()窗函數來比較日期值下面的代碼

select *, 
     STATS = case when t.DATE = LAG(DATE) OVER(ORDER BY ID) 
        then NULL 
        else STATS 
        end 
from yourtable t 
+1

我也想過,但我不認爲它會處理超過2一個小組。 – sgeddes

+0

你是什麼意思「在一個組中超過2」?例子? – Squirrel

+0

也謝謝@Squirrel是幫助我的問題,在本地i.ve使用SQL 2012年,但我不知道在服務器使用 – Ricky

0

使用

;with temp as (
      select id,name ,PO_NUMBER ,DATE, STATS, 
      LAG (STATS, 1, 0) 
      OVER (PARTITION BY name ,PO_NUMBER ,DATE ORDER BY id) AS PrevSTATS 
      from tableName 
    ) 
     select id,name ,PO_NUMBER ,DATE, 
     case when STATS = PrevSTATS then null 
       else  STATS end as STATS 
    from temp 
相關問題