Frage

Ich habe eine Tabelle mit mehreren Datumsspalten pro Mitarbeiter:

   Emp 1, Date1, Date2, Date3
   Emp 2, Date1, Date2, Date3

etc.

Ich mag eine einzelne Abfrage schreiben, die das maximale Datum der drei Termine auf einer pro-Mitarbeitern Basis zu mir zurückkehrt. Ich verstehe, ich brauche eine UNION ALL-Abfrage zu schreiben, aber ich kann nicht scheinen, um die Syntax zu bekommen, so dass ich einen Maximalwert pro Mitarbeiterdatensatz erhalten. Ich halte den gleichen Wert für alle Mitarbeiter zu bekommen. Ich bin sicher, dass dies ein dummer Fehler, aber es macht mich verrückt. Jede mögliche Hilfe würde geschätzt.


Vielen Dank für die schnelle Reaktion! Gibt es eine Möglichkeit, dies zu tun, ohne eine Anweisung von IIF mit? Ich möchte es verallgemeinern, wenn überhaupt möglich, da es mehrere andere Datumsfelder sind und es wird wirklich unhandlich die IIF Logik herauszufinden.

Auch habe ich vergessen zu erwähnen, dass jede dieser Daten leer sein könnte, und die IIF Logik scheint die NULL als Maximalwert zurückzukehren.

War es hilfreich?

Lösung

Will etwas wie diese Arbeit?

select
  EmployeeColumn,
  iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3)
from yourTable

Andere Tipps

SELECT ID, Max(TheDate) AS MaxDate
FROM
(
   SELECT ID, Date1 AS TheDate
   FROM myTable
   UNION 
   SELECT ID, Date2 AS TheDate
   FROM myTable
   UNION
   SELECT ID, Date3 AS TheDate
   FROM myTable
)
GROUP BY ID

Ich weiß, dass dies nicht eine saubere Lösung.
Aber das ist, was Sie suchen, wenn Sie schrieb von UNION.

EDIT: Sie könnten verwenden UNION ALL statt UNION. Mit obiger Abfrage, es wird keinen Unterschied in der Ausgabe machen, nehme ich an.

wäre so etwas wie dies zu tun: (Dies war MSSQL2008 nicht sicher, ob es in Acess funktionieren wird)

Erstellen von Testdaten

create table t1
    ( EmployeeId int,
      Date1  datetime,
      Date2  datetime,
      date3  datetime)

insert into t1 values (1, '2009-10-11', '2009-04-01', '2009-12-25')
insert into t1 values (2, '2009-10-24', '2009-04-03', '2009-12-19')

Meine Suche

select case 
    when date1 > date2 and DATE1 > date3 then date1
    when date2 > date1 and date2 > date3 then date2
    when date3 > date1 and date3 > date2 then date3
    end as highest
    from t1 

Wenn Sie nicht die Lösung für SQL beschränken wollen, könnten Sie meine iMax () Funktion:

  Public Function iMax(ParamArray p()) As Variant
  ' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
    Dim i As Long
    Dim lngUBound As Long
    Dim v As Variant

    v = p(LBound(p))
    lngUBound = UBound(p)
    For i = LBound(p) + 1 To lngUBound
      If v < p(i) Then
         v = p(i)
      End If
    Next
    iMax = v
  End Function

Ich nenne es "Immediate Max ()" auf Analogie von IIf (), Immediate If (), weil es für die Verarbeitung auf Zeilenebene innerhalb einer Abfrage bestimmt wird.

Wow! Ich sehe es zu komplex ist, ein einfach zu tun. Max(Field-Constant1,Constant2)

Mein Ziel: Calulate Wert abhängig von nur einem eingereicht, aber berechneter Wert nicht unterschreiten lassen als eine Konstante

.

Expample Zeilen auf einer Zwei-Feld-Tabelle (KeyField, Valuefield):

1 10
2 5
3 8
4 Null

Ich möchte eine auswählen, die zurückgibt (wenn Constant1 = 6 und Constant2 = 1), lege ich die ganze Mathematik zu klären (nur die oberste rechte Teil nach dem letzten = ist, was ich will):

1 Max(10-6,1)=Max(4,1)=4
2 Max(5-6,1)=Max(-1,1)=1
3 Max(8-6,1)=Max(2,1)=1
4 Max(Null-6,1)=Max(Null,1)=Null

Also ich will nur (wenn Constant1 = 6 und Constant2 = 1) in Fall ist es nicht genug, um klar:

1 4
2 1
3 1
4 Null

Hüten Sie sich vor dieser Null.

ich wirklich will etwas wirklich komplexen, aber die Lösung, dass ich die komplex zu lösen wäre in der Lage mag ich.

Es kann als wieder aufgenommen werden: -Return Null, wenn der Wert Null oder kein gültiger Wert für den Mathe-Operator verwendet wird (nicht Allways ist nur ein - oder +, etc.) -Return den berechneten Wert, wenn es möglich ist, die Mathematik zu tun, sondern auf einen Bereich (nicht weniger als einen Wert und nicht größer als ein anderer Wert) begrenzt.

Wenn ich es auf Pseudo-Code zu tun wäre es wie folgt aussehen:

try // try to do the maths
   MyCalculatedValue=SomeMaths(FieldValue);
   MyCalculatedValue=Min(Max(MyCalculatedValue,MinValue),MaxValue);
except // In case the SomeMaths can not be done (FieldValue is Null, negative square, division by zero, etc)
      MyCalculatedValue=Null;
end;
return MyCalculatedValue;

Für den Fall, jemand sagt Datenbank nicht normalisiert ist: Ich habe einige Mathematik auf ein Feld tun will, dann das Ergebnis in einem Bereich zu begrenzen; so kleinste Beispieldatenbank nur eine Tabelle hat, die nur zwei Felder (eindeutiges Schlüsselfeld, Datenfeld) haben werden, ist, dass imposible nicht vollständig normalisiert werden; Ich spreche nicht über maximun einiger Felder auf einer Zeile, weder maximun für eine vollständige Tabelle auf einem Feld (Aggregatfunktionen) nur nur i eine untere und eine obere Grenze auf einen berechneten Wert setzen möchten, aber wenn man bedenkt Null, wenn ein solcher Wert Null oder der Mathematik wird auf einen solchen Wert kann getan werden, nicht (wie Constant1 / (Fieldvalue-Constant2) Fälle, etc.) durchgeführt werden.

Reale Probe nur falls jemand nicht bekommen, wenn diese verwendet werden kann:

Tabellenfelder:

ID (Key)
SpacePosition (DecimalData)

Gewünschtes Ergebnis Felder für die Abfrage:

ID as ID
Min(Max(SpacePosition-SomeSpaceLongitud,StartPosition),EndPosition) AS RangeStart
Min(Max(SpacePosition+SomeSpaceLongitud,StartPosition),EndPosition) AS RangeEnd

Hope Probe ist klar und hofft jemand kann helfen, mit etwas einfacher als VBA-Funktionen verwenden!

P. D .: Denken Sie, dass eine solche Mathematik komplexer sind als nur + und - und Tisch hat viel, viel mehr Register als nur ein paar, denken an in der Nähe von einigen Milliarden von Registern. P.P.D .: Es ist keine Option zu hart Code solche Ergebnisse, da es nicht normalisierte Datenbank wäre und am schlimmsten, so Bereichsgrenzen sind Werte, die durch Benutzer eingegeben, wenn die Abfrage ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top