2017-04-26 34 views
2

我只需要它從表格中拉取「最後一次發票日期」而不是所有內容。任何想法如何做到這一點?或者任何人都可以將我指向正確的方向。我是一個sql查詢的新手。我使用MS SQL 2016年斷絕從每個客戶發票中選擇最新的發票日期,並使用同一客戶的多個發票

Vendor_Number Vendor_Name  VendorInvoiceDate  DaysLastInvoiced 
    3568 a INDUSTRIES INC 2016-11-12 07:02:41.743 165 
    3568 a INDUSTRIES INC 2016-10-08 07:03:31.170 200 
    3568 a INDUSTRIES INC 2016-10-06 07:09:46.880 202 
    3568 a INDUSTRIES INC 2016-09-21 07:04:30.267 217 
    3568 a INDUSTRIES INC 2016-04-26 07:04:27.570 365 
    3215 o Outdoors, Inc. 2016-03-02 07:39:30.137 420 
    3215 o Outdoors, Inc. 2016-02-25 07:24:04.207 426 
3215 o Outdoors, Inc. 2016-02-22 07:02:51.787 429 

輸入代碼在這裏

Select distinct 
     REF02_VR as Vendor_Number 
    , N102_RI as Vendor_Name 
    , VendorInvoiceDate 
    , DATEDIFF(day,(select VendorInvoiceDate),Getdate()) AS DaysLastInvoiced 
From 
    INSCIO_EDI810 a 
WHERE 
    1 = 1 
and 
    a.VendorInvoiceDate >= '2016-01-01 00:37:21.370' 
order by 
    N102_ri, a.VendorInvoiceDate desc 
+0

請包括輸出應該的樣子。 –

回答

3

使用top with tiesrow_number()讓每個供應商的最新發票:

select top 1 with ties 
    ref02_vr as Vendor_Number 
    , N102_ri as Vendor_Name 
    , VendorInvoiceDate 
    , datediff(day,VendorInvoiceDate,getdate()) as DaysLastInvoiced 
from inscio_edi810 a 
where a.VendorInvoiceDate >= '2016-01-01 00:37:21.370' 
order by row_number() over (partition by ref02_vr order by VendorInvoiceDate desc) 

要添加額外的order by將上述內容放在子查詢中:

select * 
from (
    select top 1 with ties 
     ref02_vr as Vendor_Number 
    , N102_ri as Vendor_Name 
    , VendorInvoiceDate 
    , datediff(day,VendorInvoiceDate,getdate()) as DaysLastInvoiced 
    from inscio_edi810 a 
    where a.VendorInvoiceDate >= '2016-01-01 00:37:21.370' 
    order by row_number() over (partition by ref02_vr order by VendorInvoiceDate desc) 
) s 
order by DaysLastInvoiced desc 

with common_table_expression as()使用row_number()版本:

;with cte as (
    select * 
     , rn = row_number() over (
       partition by ref02_vr 
       order by VendorInvoiceDate desc 
      ) 
    from inscio_edi810 
) 
select 
    ref02_vr as Vendor_Number 
    , N102_ri as Vendor_Name 
    , VendorInvoiceDate 
    , datediff(day,VendorInvoiceDate,getdate()) as DaysLastInvoiced 
from cte 
where rn = 1 
order by DaysLastInvoiced desc 

crossapply版本:

select distinct 
    a.ref02_vr as Vendor_Number 
, a.N102_ri as Vendor_Name 
, x.VendorInvoiceDate 
, datediff(day,x.VendorInvoiceDate,getdate()) as DaysLastInvoiced 
from inscio_edi810 a 
    cross apply (
    select top 1 VendorInvoiceDate 
     from inscio_edi810 as i 
     where i.ref02_vr =a.ref02_vr 
     order by i.VendorInvoiceDate desc 
    ) as x; 
order by DaysLastInvoiced desc 

每個三個版本rextester演示:http://rextester.com/UBX8146

每個回報:

+---------------+------------------+---------------------+------------------+ 
| Vendor_Number | Vendor_Name | VendorInvoiceDate | DaysLastInvoiced | 
+---------------+------------------+---------------------+------------------+ 
|   3568 | a INDUSTRIES INC | 2016-11-12 07:02:41 |    165 | 
|   3215 | o Outdoors, Inc. | 2016-03-02 07:39:30 |    420 | 
+---------------+------------------+---------------------+------------------+ 
+0

我如何訂購Days_lastInvoiced desc? – Jenesis

+0

@Jenesis更新爲每個版本添加'order by DaysLastInvoiced desc'。 – SqlZim