2017-10-06 3 views
0

Ich habe eine Tabelle mit 700 Spalten. Ich versuche, eine Liste von verschiedenen Werten für jede Spalte und ihre Anzahl zu erhalten. Ich bin mit der folgenden Abfrage das Ergebnis für 1 SpalteAnzeige Anzahl und unterschiedliche Werte für alle Spalten in einer Tabelle

Select distinct col1, count(*) from MyTable group by 1. 

Ergebnis zu erhalten:

col1 count(*) 
a  10 
b  20 
c  40 

Wie kann ich das Ergebnis für alle Spalten bekomme eine einzelne Abfrage in optimaler Art und Weise verwendet?

+0

700 Spalten? Das ist ein Wiiide-Tisch, wir haben heute unseren Anteil an täglichen WTF-Fragen bekommen. dynamic sql loop – Twelfth

+0

Markieren Sie Ihre Frage mit der von Ihnen verwendeten Datenbank. –

Antwort

1

Die grundlegende Frage ist:

select col001, count(*) from MyTable group by col001 union all 
select col002, count(*) from MyTable group by col002 union all 
. . . 
select col700, count(*) from MyTable group by col700 ; 

nicht angenehm, aber das ist im Grunde die Abfrage, die Sie ausführen müssen. SQL macht nicht wirklich mehrere unabhängige Aggregationen effizienter als sie separat zu tun (sogar mit grouping sets, meiner Erfahrung nach).

Sie können die Abfrage erstellen. Eine Möglichkeit ist, um so etwas zu laufen:

select replace(replace('select [col], count(*) as cnt from [tab] group by [col] union all ', 
         '[tab]', table_name 
        ), '[col]', column_name 
       ) 
from information_schema.columns 
where table_name = 'mytable' and table_schema = ??; 

Sie können dann kopieren Sie die generierten SQL (die endgültige union all entfernen) und führen Sie es.

Hinweis: Das oben ist generisch; Der genaue Code kann sich je nach Datenbank unterscheiden.

Verwandte Themen