Ich habe eine Tabelle mit N Spalten. Nennen wir sie c1
, c2
, c3
, c4
, ... cN
. Unter mehreren Zeilen möchte ich eine einzelne Zeile mit COUNT DISTINCT(cX)
für jedes X in [1, N] bekommen.Wie führe ich die gleiche Aggregation für jede Spalte durch, ohne die Spalten aufzulisten?
Gibt es eine Möglichkeit, dies (in einer gespeicherten Prozedur) zu tun, ohne jeden Spaltennamen manuell in die Abfrage zu schreiben?
Warum?
Wir hatten ein Problem, wo Fehler in Anwendungsserver bedeuten, dass wir gute Spaltenwerte mit später eingefügtem Müll neu schreiben. Um dies zu lösen, speichere ich die Informationsprotokollstruktur, wobei jede Zeile eine logische UPDATE
Abfrage darstellt. Wenn dann ein Signal gegeben wird, dass die Aufzeichnung abgeschlossen ist, kann ich feststellen, ob irgendwelche Werte (fälschlicherweise) überschrieben wurden.
Ein Beispiel für einen einzelnen korrekten Datensatz in mehreren Zeilen: Es gibt höchstens einen Wert für jede Spalte.
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 12:00am | NULL | 2:00pm |
Reconciled row:
| 1 | 12:00am | 1:00pm | 2:00pm |
Ein Beispiel für einen unversöhnlichen Datensatz, den ich erkennen soll:
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 9:00am | 1:00pm | 2:00pm | -- New initialize time => irreconcilable!
Fragen Sie, wie die Spaltennamen abgerufen werden oder wie die Aggregation durchgeführt wird? –
Ich weiß, wie die Spaltennamen abgerufen werden, aber ich weiß nicht, was zu tun ist, um einen Ausdruck um jeden Spaltennamen in der Abfrage zu erweitern. Ich möchte vermeiden, SELECT COUNT DISTINCT (C1), COUNT DISTINCT (C2), ..., COUNT DISTINCT (CN) FROM ... 'in meiner gespeicherten Prozedur. –
Sie können dies natürlich mit dynamischem SQL tun. Übrigens, wie groß ist X? – dezso