2017-03-19 99 views
0

示例表卡斯特查找最新的日期

CustID | CustNameTx 
---------+------ 
1  | Paul 
2  | Bob 
3  | Chuck 

示例表發票

Date  | InvCustID 
-----------+------ 
19/02/2017 | 2 
19/02/2017 | 1 
19/02/2018 | 2 
19/02/2017 | 3 

示例結果

CustID | CustNameTx | Expired 
------+------------+--------- 
1  | Bob  | 19/02/2017 
3  | Chuck | 19/02/2017 

我試圖寫入產生如上結果所需的SQL代碼。 在第一張表中,我有客戶記錄。 第二張表用於保存具有到期日的客戶發票。 我正在嘗試編寫一個代碼,以查找30天前成員已過期且尚未續訂的客戶。因此,代碼需要跳過那些重新成爲會員的客戶。 我正在使用Microsoft SQL。

這就是我迄今爲止成功寫的。

SELECT CuFirstNameTx, CuStoreNoTx_N 
FROM T_CuCust 
INNER JOIN T_IIInvoiceItem ON IICustID=CuCustID 
WHERE DATEDIFF (d, IIShipDate_N,GetDate()) = 31 

SELECT MAX(IIShipDate_N), IICustID 
FROM T_IIInvoiceItem 
GROUP BY IICustID 

這兩個工作都是分開進行的,但是我沒有設法在一行中「合併」兩行代碼來生成上面的結果。

+0

_「我試圖寫SQL」 _ - 那麼說明SQL和解釋它如何做或不做你想做的事。 – CodeCaster

+0

添加了我設法寫的代碼。 – DeepDiver

回答

1

一個非常簡單的方法來處理這個問題 -

SELECT [CustID] 
     , [CustNameTx] 
     , MAX([Date]) AS [Expired] 
    FROM [Invoices] AS I 
    JOIN [Cust] AS C ON I.[InvCustID] = C.[CustID] 
GROUP BY [CustID] 
     , [CustNameTx] 
HAVING MAX([Date]) < DATEADD(DAY, -30, GETDATE()) 
+0

謝謝你,我也跟着你的建議,並寫了下面的 SELECT CuCustID ,CuFirstNameTx ,MAX(IIShipDate_N)爲過期 FROM T_IIInvoiceItem AS我 JOIN T_CuCust AS C ON I.T_IIInvoiceItem = C.CuCustID GROUP BY CuCustID ,CuFirstNameTx 但是,它返回錯誤 無效的列名稱'T_IIInvoiceItem'。 這實際上是表的名稱,它是正確的。 – DeepDiver

0

你可能在尋找這樣的事情:

select * from 
Cust c 
cross apply (
    Select top 1 * 
    from Invoices i 
    where c.CustID = i.InvCustID and 
    i.[Date] < getdate() and i.[Date] > dateadd(day, -30, getdate()) i1 
where 
    not exists (select 1 from Invoices i2 where c.CustID = i.InvCustID and i.[Date] > getdate()) 
0

謝謝你,我也跟着你的建議,並寫了下面的

SELECT CuCustID 
     , CuFirstNameTx 
     , MAX(IIShipDate_N) AS Expired 
    FROM T_IIInvoiceItem AS I 
    JOIN T_CuCust AS C ON I.T_IIInvoiceItem = C.CuCustID 
GROUP BY CuCustID 
     , CuFirstNameTx 
HAVING MAX(IIShipDate_N) < DATEADD(DAY, -30, GETDATE()) 

但是,它返回一個錯誤

無效的列名'T_IIInvoiceItem'。

這實際上是表的名稱,它是正確的。

0

基於從Shuvankar的建議,我設法寫我需要

SELECT IICustID, CuFirstNameTx, MAX(IIShipDate_N) AS Expired 
FROM T_IIInvoiceItem 
INNER JOIN T_CuCust ON CuCustID=IICustID 
GROUP BY IICustID, CuFirstNameTx 
HAVING DATEDIFF(d, MAX(IIShipDate_N),GetDate())=30 

的幫助非常感謝代碼