Quantcast
Channel: APEX-AT-WORK by Tobias Arnhold
Viewing all articles
Browse latest Browse all 177

Analytische Funktionen (Teil 1): SUM mit CASE WHEN

$
0
0
Es gibt wie in meinem letzten Post beschrieben, sehr viele Artikel zu analytischen Funktionen. Diese zeigen die Fähigkeiten aber nur an der Oberfläche. Deshalb möchte ich in den nächsten Monaten die besten Tricks mal beispielhaft abbilden.

Als Grundlage habe ich eine Tabelle mit Einwohnern je Bundesland und Jahr. Als Quelle gilt das Statistische Bundesamt.

SELECT
JAHR,
BUNDESLAND,
EINWOHNER
FROM AS_EINWO_BUNDESL_JAHR
WHERE JAHR = 2014
ORDER BY 1,2
JAHRBUNDESLANDEINWOHNER
2014Baden-Württemberg10.666.000
2014Bayern12.643.000
2014Berlin3.443.000
2014Brandenburg2.449.000
2014Bremen659.000
2014Hamburg1.762.000
2014Hessen6.059.000
2014Mecklenburg-Vorpommern1.594.000
2014Niedersachsen7.799.000
2014Nordrhein-Westfalen17.579.000
2014Rheinland-Pfalz3.996.000
2014Saarland989.000
2014Sachsen4.045.000
2014Sachsen-Anhalt2.238.000
2014Schleswig-Holstein2.819.000
2014Thüringen2.156.000

In meinem ersten Beispiel möchte ich eine bedingte Summierung zeigen. Dazu soll für die Top 5 Bundesländer mit der höchsten Einwohnerzahl das Verhältnis zur Gesamtanzahl aller Bundesbürger in Prozent aufgezeigt werden. Zusätzlich werden die TOP 5 Bundesländer FETT markiert.

Info: Wenn meine Beispiel nicht gefallen, dann kann ich es verstehen. Ich löse für gewöhnlich Probleme und denke sie mir nicht aus. :)
SELECT
BUNDESLAND,
EINWOHNER,
SUM(EINWOHNER) OVER () as EINWOHNER_GESAMT,
/* Beispiel: Summe über Einwohner nur wenn TOP5 = 1 */
SUM(CASE WHEN IN_TOP5 = 1 THEN EINWOHNER ELSE 0 END) OVER () AS EINWOHNER_TOP5,
/* Prozentwertberechnung */
round(SUM(CASE WHEN IN_TOP5 = 1 THEN EINWOHNER ELSE 0 END) OVER () / SUM(EINWOHNER) OVER () * 100,0) IN_PROZ
FROM
(
SELECT
JAHR,
/* Generierung der TOP 5 mit B-Tag */
case when
row_number () over (order by EINWOHNER desc) <= 5
then
''||BUNDESLAND||''
else
BUNDESLAND
end as BUNDESLAND,
/* Ausgabe TOP-5 mit 1 Sonst 0 */
case when
row_number () over (order by EINWOHNER desc) <= 5
then
1
else
0
end as IN_TOP5,
EINWOHNER
FROM AS_EINWO_BUNDESL_JAHR
WHERE JAHR = 2014
)
ORDER BY 1, 3 desc
BUNDESLANDEINWOHNEREINWOHNER_GESAMTEINWOHNER_TOP5IN_PROZ
<b>Baden-Württemberg</b>10.666.00080.896.00054.746.00068
<b>Bayern</b>12.643.00080.896.00054.746.00068
Berlin3.443.00080.896.00054.746.00068
<b>Hessen</b>6.059.00080.896.00054.746.00068
<b>Niedersachsen</b>7.799.00080.896.00054.746.00068
<b>Nordrhein-Westfalen</b>17.579.00080.896.00054.746.00068
Brandenburg2.449.00080.896.00054.746.00068
Bremen659.00080.896.00054.746.00068
Hamburg1.762.00080.896.00054.746.00068
Mecklenburg-Vorpommern1.594.00080.896.00054.746.00068
Rheinland-Pfalz3.996.00080.896.00054.746.00068
Saarland989.00080.896.00054.746.00068
Sachsen4.045.00080.896.00054.746.00068
Sachsen-Anhalt2.238.00080.896.00054.746.00068
Schleswig-Holstein2.819.00080.896.00054.746.00068
Thüringen2.156.00080.896.00054.746.00068

Hmm die Reihenfolge mit dem Order By hätte ich etwas besser auswählen können. :O

Viewing all articles
Browse latest Browse all 177

Trending Articles