2016-05-08 8 views
0

ich folgendes dynamisch zu identifizieren alle Dezimalfeldern in Tabelle mit vielen Spalten laufen kann:MySQL min und max jeder Spalte

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='tbl_name' AND DATA_TYPE = 'decimal' 

Wie würde ich den minimalen und maximalen Wert für jedes dieser Felder ziehen? z.B. Endausgabe wie:

COLUMN_NAME DATA_TYPE MIN_VAL MAX_VAL 
a   decimal 4  22 
b   decimal 18  5593 
c   decimal 1  299 

UPDATE:

Hier ist die letzte Syntax habe ich diese Funktion zu erhalten. Vielleicht habe ich einen einfacheren Weg verpasst, aber das funktioniert, also dank Gordon Linoff für die Antwort.

set @sql = concat('SELECT ', @cols, ' FROM ', @t); 

SELECT @sql := GROUP_CONCAT(REPLACE(REPLACE(@sql, @cols, 
              CONCAT('"', COLUMN_NAME, '" as TheCol', ', ', '"', DATA_TYPE, '" as TheDType', ', ', 
                'MIN(', COLUMN_NAME, ') as TheMin, MAX(', COLUMN_NAME, ') as TheMax' 
               ) 
              ), 
            @t, 'tbl_name') SEPARATOR ' union all ' 
          )    
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='tbl_name' AND DATA_TYPE = 'decimal'; 

prepare s from @sql; 
execute s; 
deallocate prepare s; 
+0

Wrte eine dynamische SQL-Anweisung auf der Grundlage den Tabellennamen und Spaltennamen die min max zu erhalten ... – xQbert

Antwort

1

Sie müssen dynamische SQL verwenden:

set @sql = 'SELECT @cols FROM @t'; 

SELECT @sql := GROUP_CONCAT(REPLACE(REPLACE(@sql, @cols, 
              CONCAT(COLUMN_NAME, ', ', DATA_TYPE, ', ', 
                'MIN(', COLUMN_NAME, '), MAX(', COLUMN_NAME, ')' 
               ) 
              ), 
            @t, 'tbl_name') SEPARATOR ' union all ' 
          )    
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='tbl_name' AND DATA_TYPE = 'decimal'; 

prepare s from @sql; 
execute s; 
deallocate prepare s; 
+0

einen Syntaxfehler auf der 'SEPARATOR' Linie Werfen . Ich ersetzte offensichtlich den tatsächlichen Tabellennamen in den 2 Stellen, auf die verwiesen wird - sind irgendwelche anderen Änderungen erforderlich? – Dylan