2016-04-06 11 views
0

Ich habe eine Abfrage, die die MAXCloseDate aus einer Tabelle, dass has many schließen Termine, grouped by die ShipmentNumber Spalte zurückgeben sollte. Ich scheine mehr als eine ShipmentNumber in den Ergebnissen zu bekommen, wenn ich die Notes Spalte einschließe.SQL Server 2008 - nicht immer Max Erste

Tisch Arbeitsaufträgen

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 

Tabelle Projekte

ProjectNumber, Name 
884, Project A 

Abfrage:

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)) ; 

Ergebnisse:

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

sein könnte, weil der linken Seite kommen. SQL LINKES JOIN-Schlüsselwort. Das Schlüsselwort LEFT JOIN gibt alle Zeilen aus der linken Tabelle (table1) mit den übereinstimmenden Zeilen in der rechten Tabelle (table2) zurück. – LearningPhase

Antwort

1

@Irb hat das in den Kommentaren bekommen; Sie gruppieren sich nach WO.ShipmentNumber und haben unterschiedliche Werte für die erste und dritte Zeile; also beides bekommen.

Wenn Sie nur die WO mit dem max schließen Datum aufnehmen, versuchen Sie dies:

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

Das ist es, danke! – visevo