Ich bin nicht sicher, was der beste Titel meiner Frage wäre, aber ich werde mein Problem/Frage der beste unten erklären:SQL - Für jede Schleife in einer Abfrage
ich die folgende Abfrage verwenden , wo ich auf einem Arbeitsauftrag filtern, und ich sammle alle die Geschichte davon, die ich gezeigt zu meinem Bericht benötigen würde:
select a.name, d.data, h.started, e.name, * from wshhistory h
join asset a
on a.uid = h.assetid
join wshfld d
on h.uid = d.wshhistid
join fielddefinition f
on d.flddefid = f.uid
join enumlookup e
on h.assetstatus = e.uid
where h.shdid = '43FEB092-D3B1-4008-9C44-A3A249987849' order by a.name, h.started asc
Mein Ergebnis ist in Ordnung, aber ...
Was? Ich würde nur 1 Zeile (die letzte/oberste) von jedem (einzigartigen) Asset und die anderen Zeilen alle als Spalte benötigen, so dass wir nur 1 Zeile für jedes Asset haben. So, dass mein Bericht wie folgt aussieht:
In vb.net würde ich mit einem Fix diese für jede Schleife alle Vermögenswerte gehen durch, aber mit SQL mein Wissen ist begrenzt, und ich habe keine Ahnung, wie man das in einer Abfrage löst.
Irgendeine Idee?
Vielen Dank im Voraus!
Mögliche Duplikat arbeiten [Select erste Zeile in jeder Gruppe GROUP BY?] (http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) –
Wenn ich nach Name (oder Asset-ID) gruppieren würde , dann bekomme ich die Nachricht: Die Spalte 'asset.name' ist in der Auswahlliste ungültig, weil sie nicht in einem Aggregat f enthalten ist oder die GROUP BY-Klausel. Wenn ich alle diese Auswahlkriterien entfernen und mit * gehen würde, bekomme ich immer noch die gleiche Fehlermeldung, aber mit einer anderen Spalte ('wshhistory.uid') – GertDeWilde
Wenn Sie gruppieren müssen Sie nach allen Spalten gruppieren, die nicht sind aggregiert. Und Sie sollten die Verwendung von select * auf jeden Fall vermeiden. Benennen Sie die Spalten explizit. –