Ihre Anfrage scheint sehr einfach, aber es hat zwei Komplikationen. Der erste ist, dass eine Zeile eine Zusammenfassung der anderen beiden ist. Dies schlägt vor, rollup
oder grouping sets
in der Abfrage zu verwenden.
Die zweite ist die Anforderung, Werte zu haben, auch wenn Sie keine Daten haben. Dies deutet auf die Verwendung einer "Treiber" -Unterabfrage hin. Eine solche Unterabfrage definiert alle Zeilen in der Ausgabe, bevor Werte zugewiesen werden. Sie verwenden eine Treibertabelle mit left outer join
.
Eine unausgesprochene Anforderung könnte sein, das Jahr nur einmal zu erwähnen.
Der folgende Ansatz für die Abfrage fügt die endgültige Form für das Jahr zusammen. Die dann schließt sich links die Zusammenfassung, zieht Werte von dort gegebenenfalls:
with year as (
select 2013 as Year
)
select driver.label, coalesce(s.value, 0) as Value, driver.Year
from ((select 'Male' as label, year from year
) union all
(select 'Female' as label, year from year
) union all
(select 'Total' as label, year from year
)
) driver left outer join
(select coalesce(Gender, 'Total') as Gender, year.year, count(*) as value
from Students cross join year
group by Gender with Rollup
) s
on driver.year = s.year;
Dies setzt voraus, dass das Geschlecht als „männlich“ dargestellt wird, und „Female“ und dass es eine Spalte year
in den Daten (ohne Abtastwerteingang genannt oder Tabellenformate muss man auf Spaltennamen und Beispielwerte raten).
Vielleicht können Sie bieten DDL und Ihre aktuelle Abfrage? – Nikola
Schülertisch (id, name, gender, registeredYear) – aby
So viele verschiedene Optionen für Sie zur Auswahl :) Liebst du nicht nur SQL! – KyleK