2017-02-22 13 views
0
LN_NUMBER  RUN_DATE SALE_DATE STATUS_CODE TYPE PROCESSOR_ID  
------------------------------------------------------------------------ 
0201203909  02/21/17 09/30/15  R 1  TG1   
0201203909  02/21/17     R 2  TG1  
0201203909  02/21/17     A 1  MW1 -------choose this row for LN_number 0201203909 
0201105919  02/21/17 08/24/16  S 2  MW1 ---choose this row for LN_number 0201105919 
0201105919  02/21/17 08/24/16  S 2  MW1 
0201105919  02/21/17 07/01/15  R 2  TG1 
1400000138  02/21/17-----------------------------------------------------------Choose this for LN_NUMBER 1400000138 

私は上記の閉鎖テーブルを持っています。クロージャーテーブルからレコードを選択する必要があります。ステータスコードが存在する場合、(ROWNUM = 1としてそれを作る)、その行を選択し=ランキング関数で複数の注文方法SQL Server 2014

  • 条件はこれです。

  • ステータスコードがAでない場合は、最新のSALE_DATEのレコードを選択します(RowNum = 1にする)。

私は、このコードは= 0201105919 LN_NUMBERのため正常に動作している

SELECT 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() OVER (partition by [LN_NUMBER] order by 
        case when [STATUS_CODE]='A' then [STATUS_CODE] end asc, 
        case when [STATUS_CODE]!='A' then CONVERT(DATE,[SALE_DATE]) end desc)    
       as 'RowNum' 
FROM [dbo].[Closure ] 

このコードを試してみました。しかし、LN_NUMBER = 0201203909の場合、必要な方法でrowNumを取得できません。

これは私が結果を取得していますものです:

LN_NUMBER RUN_DATE SALE_DATE STATUS_CODE TYPE PROCESSOR_ID RowNum 
0201203909 02/21/17 09/30/15  R   1  TG1   1 
0201203909 02/21/17    R   2  TG1   2 
0201203909 02/21/17    A   1  MW1   3 
0201105919 02/21/17 08/24/16  S   2  MW1   1 
0201105919 02/21/17 08/24/16  S   2  MW1   2 
0201105919 02/21/17 07/01/15  R   2  TG1   3 

誰もがSQLサーバー2014を使用していますthis.Iに私を助けてもらえお時間をありがとうございましたと

+1

たらどう? sale_dateのNULLをどのように処理する必要がありますか? –

+0

@vkp行を1つだけ選択する必要があります。 – Please

+0

OK行を1つだけ選択する必要があります。どのようにネクタイを壊すのですか? – Paparazzi

答えて

2
select 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() over (
    partition by [LN_NUMBER] 
    order by case when [STATUS_CODE]='A' then 0 else 1 end asc 
     , CONVERT(DATE,[SALE_DATE]) desc 
) as 'RowNum' 
FROM [dbo].[Closure] 
を助けます

テストのセットアップ:http://rextester.com/FNRE71956

create table Closure ( 
    LN_NUMBER varchar(10) 
    , RUN_DATE varchar(10) 
    , SALE_DATE varchar(10) 
    , STATUS_CODE char(1) 
    , TYPE int 
    , PROCESSOR_ID char(3) 
) 
insert into t values 
('0201203909','02/21/17','09/30/15','R',1,'TG1') 
,('0201203909','02/21/17','  ','R',2,'TG1') 
,('0201203909','02/21/17','  ','A',1,'MW1') 
,('0201105919','02/21/17','08/24/16','S',2,'MW1') 
,('0201105919','02/21/17','08/24/16','S',2,'MW1') 
,('0201105919','02/21/17','07/01/15','R',2,'TG1') 

クエリ:

select 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() over (
    partition by [LN_NUMBER] 
    order by case when [STATUS_CODE]='A' then 0 else 1 end asc 
     , CONVERT(DATE,[SALE_DATE]) desc 
) as 'RowNum' 
FROM [dbo].[Closure] 

結果: `A`ステータスを持つ複数の行があり

+------------+----------+-----------+-------------+------+--------------+--------+ 
| LN_NUMBER | RUN_DATE | SALE_DATE | STATUS_CODE | TYPE | PROCESSOR_ID | RowNum | 
+------------+----------+-----------+-------------+------+--------------+--------+ 
| 0201105919 | 02/21/17 | 08/24/16 | S   | 2 | MW1   |  1 | 
| 0201105919 | 02/21/17 | 08/24/16 | S   | 2 | MW1   |  2 | 
| 0201105919 | 02/21/17 | 07/01/15 | R   | 2 | TG1   |  3 | 
| 0201203909 | 02/21/17 |   | A   | 1 | MW1   |  1 | 
| 0201203909 | 02/21/17 | 09/30/15 | R   | 1 | TG1   |  2 | 
| 0201203909 | 02/21/17 |   | R   | 2 | TG1   |  3 | 
+------------+----------+-----------+-------------+------+--------------+--------+ 
+0

ありがとうございます。それは今働いている。ありがとうございました – Please

+0

@お手伝いをしてください! – SqlZim

関連する問題