2016-04-06 70 views
0

我有一個查詢,應該返回has many關閉日期ShipmentNumber列表MAXCloseDate列。 當我包含Notes列時,我似乎在結果中獲得了多個ShipmentNumberSQL Server 2008 - 並不總是最大

表工作訂單

WorkOrderID, ProjectNumber, ShipmentNumber, CloseDate, WorkOrderNotes 
1, 884, 123-01, 2016-04-01, Note A 
2, 884, 123-01, 2016-04-02, Note B 
3, 884, 123-02, 2016-04-01, Note A 

表項目

ProjectNumber, Name 
884, Project A 

查詢:

SELECT p.id, p.name, WO.ShipmentNumber,MAX(WO.CloseDate) AS CloseDate, 
CAST(WO.WorkOrderNotes AS NVARCHAR(100)) AS WorkOrderNotes 
FROM DA.dbo.WorkOrders AS WO 
LEFT JOIN Projects.dbo.project_primary AS p ON p.id = WO.ProjectNumber 
WHERE WO.CloseDate >= '2016-03-01' 
AND WO.CloseDate IS NOT NULL 
GROUP BY WO.ShipmentNumber, p.name, p.id, CAST(WO.WorkOrderNotes AS NVARCHAR(100)) ; 

結果:

884, Project A, 123-01, 2016-04-01, Note A <-- Should not be here 
884, Project A, 123-01, 2016-04-02, Note B 
884, Project A, 123-02, 2016-04-01, Note A 
+0

可能是因爲你的左連接。 SQL LEFT JOIN關鍵字。 LEFT JOIN關鍵字返回左表(table1)中的所有行,右表中的匹配行(table2)。 – LearningPhase

回答

1

@Irb在評論中得到了這個;您正在按WO.ShipmentNumber進行分組,第一行和第三行的值有所不同;從而獲得兩者。

如果你只想要WO與最大結束日期記錄,試試這個:

SELECT p.id 
, p.name 
, WO.ShipmentNumber 
, WO.CloseDate 
FROM (
    select ProjectNumber 
    , ShipmentNumber 
    , CloseDate 
    , CAST(WorkOrderNotes AS NVARCHAR(100)) AS WorkOrderNotes 
    , row_number() over (partition by ProjectNumber order by CloseDate desc) r 
    from DA.dbo.WorkOrders 
    WHERE WO.CloseDate >= '2016-03-01' 
    AND WO.CloseDate IS NOT NULL 
) AS WO 
LEFT JOIN Projects.dbo.project_primary AS p 
    ON p.id = WO.ProjectNumber 
WHERE WO.r = 1 --only return the record with the most max CloseDate 
GROUP BY p.id 
, p.name 
, WO.ShipmentNumber 
, WO.WorkOrderNotes 
+0

這樣做了,謝謝! – visevo