2013-10-14 58 views
2

我有3代表的SQL數據庫:SQL - 查詢報告MAX DATE結果或NULL結果

  1. Customer record表,持主數據(每行是唯一的)
  2. Customer notes,每個音符數據/時間戳記(有可能是每個客戶的音符,或根本沒有)
  3. Product表,顯示該客戶已經購買該產品

    表:tbl_Customer_記錄
    客戶ID ----公司名稱公司----- -----段促銷代碼

    表:tbl_Customer_Notes
    客戶ID ----注意-----創建日期

    表:tbl_Customer_Products
    客戶ID ----產品類別

我想就是拉僅包含最新備註的客戶記錄列表,因此如果存在多個備註,則不存在重複行。但我也希望我的報告包含客戶記錄,如果根本沒有記錄。我已經用SELECT MAX函數實現了第一部分,並且運行良好,問題是當我在下面的最後一行代碼中添加OR = NULL子句時。這是行不通的,我找不出解決方案。

任何建議將不勝感激!

SELECT   

[tbl_Customer_Records].[CustomerID], 
[tbl_Customer_Records].[Company Name], 
[tbl_Customer_Records].[Company Segment], 
[tbl_Customer_Records].[Promo Code], 
[tbl_Customer_Notes].[Note], 
[tbl_Customer_Products].[Product Category] 

FROM    

tbl_Customer_Records 
LEFT OUTER JOIN tbl_Customer_Notes 
ON tbl_Customer_Records.CustomerID = tbl_Customer_Notes.CustomerID 
LEFT OUTER JOIN tbl_Customer_Products 
ON tbl_Customer_Records.CustomerID = tbl_Customer_Products.CustomerID 

WHERE 
[Product Category] in ('Nuts','Bolts','Screws','Spanners') 

AND 

[Created Date] in (SELECT MAX ([Created Date]) FROM tbl.Customer_Notes GROUP BY [CustomerID]) 

OR tbl_Customer_Note.Note is null 

回答

1

是有一些技巧做這樣的查詢(ROW_NUMBER或分組數據連接),但我認爲最乾淨的一個了你的情況是使用外部應用:

select 
    cr.[CustomerID], 
    cr.[Company Name], 
    cr.[Company Segment], 
    cr.[Promo Code], 
    cn.[Note], 
    cp.[Product Category] 
from tbl_Customer_Records as cr 
    left outer join tbl_Customer_Products as cp on cp.CustomerID = cr.CustomerID 
    outer apply (
     select top 1 
      t.[Note] 
     from tbl_Customer_Notes as t 
     where t.[CustomerID] = cr.[CustomerID] 
     order by t.[Created_Date] desc 
    ) as cn 
where 
    cp.[Product Category] in ('Nuts','Bolts','Screws','Spanners') 

改變了所有笨拙table name.column namealias.column name,我認爲這是更具可讀性這種方式。

或者:

select 
    cr.[CustomerID], 
    cr.[Company Name], 
    cr.[Company Segment], 
    cr.[Promo Code], 
    cn.[Note], 
    cp.[Product Category] 
from tbl_Customer_Records as cr 
    left outer join tbl_Customer_Products as cp on cp.CustomerID = cr.CustomerID 
    left outer join tbl_Customer_Notes as cn on 
     cn.CustomerID = cr.CustomerID and 
     cn.[Created_Date] = (select max(t.[Created_Date]) from tbl_Customer_Notes as t where t.CustomerID = cr.CustomerID) 
where 
    cp.[Product Category] in ('Nuts','Bolts','Screws','Spanners') 
+0

感謝您的回答!關於笨拙的專欄名稱,我將來要記住這一點。有趣的是,您的第一個解決方案返回4,315個結果和第二個4,393個結果 - 與Deepshikha的解決方案相同。感謝這兩個建議,我記下了將來使用的語法。非常感謝您花時間幫忙!丹尼爾 – user1811852

+0

第一個返回任意記錄,如果有多個記錄與最大(Created_Date) –

+0

啊,是的,我明白了。我確實有多個相同的CreatedDate的筆記,所以你的第一個解決方案在這種情況下效果更好。再次感謝。 (改變了接受的答案)。 – user1811852

0

嘗試使用CustomerID not in (select CustomerID from tbl_Customer_Note)

1

可以在ON謂詞添加您的篩選條件,從左邊的表保存行,只獲取需要從右表的匹配行,從第一LEFT OUTER JOIN操作。下面的查詢應該工作:

SELECT   
CR.[CustomerID], 
CR.[Company_Name], 
CR.[Company_Segment], 
CR.[Promo_Code], 
CN.[Note], 
CP.[Product_Category] 
FROM    
tbl_Customer_Records CR 
LEFT OUTER JOIN tbl_Customer_Notes CN 
ON CR.CustomerID = CN.CustomerID AND CN.[Created_Date] in (SELECT MAX ([Created_Date]) 
                  FROM tbl_Customer_Notes 
                  WHERE CR.CustomerID = tbl_Customer_Notes.CustomerID 
                  GROUP BY [CustomerID]) 
LEFT OUTER JOIN tbl_Customer_Products CP 
ON CR.CustomerID = CP.CustomerID 
WHERE 
[Product_Category] in ('Nuts','Bolts','Screws','Spanners') 
+0

感謝您的代碼 - 確實是讚賞。我運行了這段代碼,它在我的數據集上返回了4,393個結果,所以我將這個代碼保留爲接受的答案。感謝您花時間幫助!乾杯,丹尼爾 – user1811852

1

應該工作,試圖用NULL值:

SELECT a.[CustomerID], 
     a.[Company Name], 
     a.[Company Segment], 
     a.[Promo Code], 
     a.[Note], 
     a.[Product Category] 
FROM (
SELECT   
cr.[CustomerID], 
cr.[Company Name], 
cr.[Company Segment], 
cr.[Promo Code], 
cn.[Note], 
cp.[Product Category], 
ROW_NUMBER() OVER(PARTITION BY cr.[CustomerID] ORDER BY cn.[Created Date] DESC) as rnk 
FROM tbl_Customer_Records cr 
LEFT JOIN tbl_Customer_Notes cn 
ON cr.CustomerID = cn.CustomerID 
LEFT JOIN tbl_Customer_Products cp 
ON cr.CustomerID = cp.CustomerID 
WHERE cp.[Product Category] in ('Nuts','Bolts','Screws','Spanners'))a 
WHERE a.rnk = 1 
+0

感謝代碼工廠,非常感謝。有趣的是,代碼返回4049個結果,這比其他一些解決方案建議的要少一些。謝謝! – user1811852