Ich habe eine umfangreiche Ansicht erstellt, die bestimmte Vorkommen basierend auf verschiedenen statistischen Modellen simuliert. Diese Modelle sind in jeder Spaltenüberschrift durch eine Zahl definiert und der Maximalwert einer Zeile ist das beste Modell.Abrufen des Spaltennamens, der den Maximalwert einer Zeile enthält
Die erzeugte Tabelle sieht (teilweise) folgendermaßen aus:
+--------+----+------+------+------+------+------+------+
| Number | LI | PHSE | 0505 | 0506 | 0507 | 0508 | 0509 | [...] etc.
+--------+----+------+------+------+------+------+------+
| 100254 | 2 | M1 | 44 | 46 | 45 | 44 | 44 |
| 100254 | 2 | M2 | 36 | 36 | 35 | 37 | 37 |
| 100254 | 2 | M3 | 5 | 5 | 5 | 5 | 5 |
| 100254 | 2 | R1 | 34 | 36 | 37 | 37 | 37 |
| 100254 | 2 | R2 | 41 | 41 | 40 | 41 | 41 |
| 100329 | 1 | M1 | 37 | 38 | 38 | 38 | 39 |
| 100329 | 1 | M2 | 31 | 29 | 28 | 29 | 29 |
| 100329 | 1 | M3 | 6 | 6 | 6 | 6 | 6 |
| 100329 | 1 | R1 | 29 | 29 | 29 | 30 | 30 |
| 100329 | 1 | R2 | 25 | 26 | 26 | 27 | 26 |
+--------+----+------+------+------+------+------+------+
[...] etc.
Jetzt möchte ich den höchsten Wert in jeder Zeile zu finden und die entsprechenden Spaltennamen als solche angezeigt werden;
| Number | LI | PHSE | MAXCOL |
+--------+----+------+--------+
| 100254 | 2 | M1 | 0506 |
| 100254 | 2 | M2 | 0508 |
| 100254 | 2 | M3 | 0505 |
| 100254 | 2 | R1 | 0507 |
| 100254 | 2 | R2 | 0505 |
+--------+----+------+--------+
[...] etc.
Dieser von 100.254 abgeleitet ist - 2 - M1 größte Wert 46 auftretenden in Spalte 0506 usw.
Ich habe um mit PIVOT
Funktionen liebäugelt aber ohne Erfolg. Ich habe auch nach einem Index/Match-Äquivalent wie in Excel gesucht, aber da ich nicht auf Spaltenüberschriften als Werte verweisen kann, wird dies offensichtlich nicht funktionieren (und auch keine solche Funktion gefunden haben).
Jede Hilfe würde sehr geschätzt werden.
UPDATE pro Damien Kommentar:
Ein Auszug aus dem Code, der dazu geführt hat:
SELECT DISTINCT sub2.Number, sub2.LI, sub2.PHSE
, sum(sub2.[0505]) over (partition by sub2.Number, sub2.LI, sub2.PHSE) as '0505'
, sum(sub2.[0506]) over (partition by sub2.Number, sub2.LI, sub2.PHSE) as '0506'
[...] etc. /*64 rows*/
FROM
(SELECT DISTINCT sub.*
, CASE WHEN sub.MF > sub.[5PAV] - sub.[5PSTDEV] THEN 1 ELSE 0 END AS '0505'
, CASE WHEN sub.MF > sub.[5PAV] - sub.[6PSTDEV] THEN 1 ELSE 0 END AS '0506'
[...] etc. /*64 rows*/
FROM
(SELECT DISTINCT ra.*
, sum(ra.qtyr) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 5 preceding AND 1 preceding)/
sum(ra.qtyu) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 5 preceding AND 1 preceding) AS '5PAV'
, sum(ra.qtyr) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 6 preceding AND 1 preceding)/
sum(ra.qtyu) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 6 preceding AND 1 preceding) AS '6PAV'
[...] etc. /*8 rows*/
, stdev(ra.MF) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 4 preceding AND CURRENT row) AS '5PSTDEV'
, stdev(ra.MF) OVER (partition BY ra.Number, ra.LI, ra.PHSE ORDER BY (ra.Number) rows BETWEEN 5 preceding AND CURRENT row) AS '6PSTDEV'
[...] etc. /*8 rows*/
FROM ra
) AS sub
) AS sub2
Kein Zweifel, dass dies eine der ineffektiven Nutzung von SQL sein kann, aber die Zeit - Druck und Unerfahrenheit haben mich dazu gebracht, es so zu schreiben.
Alle Vorschläge, diesen Code zu ändern und das gewünschte Tabellenergebnis effizienter zu erreichen, würden ebenfalls sehr geschätzt werden.
EDIT pro Antons Antwort;
Der obige Code, der als pvt
zusammengefasst ist, fährt wie folgt fort;
SELECT Number, LI, PHSE, combo, hitrate
FROM (...) AS pvt
UNPIVOT
(Hitrate FOR Combo IN (
[0505],
[0506],
[...] etc.)) AS upvt
Große Lösung für ein unelegantes Problem.
Sie gemacht haben den Fehler, eine Datenbanktabelle zu behandeln, als ob es sich um eine Tabelle ist. Dies ist nicht der Fall, und Sie haben a) wiederholt Spalten mit dem gleichen "Typ" von Daten und b) Daten nicht als Daten gespeichert, sondern in den Metadaten (hier, Spaltennamen) gespeichert. Wenn Sie die Daten an erster Stelle korrekt modelliert hätten (mit zwei Spalten für das Modell und den Wert und so viel mehr Zeilen, aber weniger Spalten), wäre die Abfrage einfach zu schreiben. –
@Damien_The_Unbeliever das macht Sinn. Die Daten werden durch Unterabfragen in diesem Format generiert, so dass die Quelle nicht das Problem ist. Es ist die Methode, die ich auf diesen Punkt angewendet habe, die unwirksam scheint; Obwohl das 'Unpivot' die Daten in der von Ihnen vorgeschlagenen Weise neu arrangiert, scheint es ein sehr ineffektiver Umweg zu sein. Ich werde die obige Frage bearbeiten, um das zu vertiefen und zu sehen, wie der Code viel effizienter gestaltet werden kann. Ich bin so weit gegangen, Koalesce-Funktionen in Excel zu verwenden, um die Abfrage unter Berücksichtigung aller beteiligten Variablen zu schreiben. Es ist dumm ich weiß, aber Zeitdruck und begrenzte Erfahrung führte mich zu dieser Methode – Sambo