Summe auf temporäre Tabelle

Dirk D

Neuer Benutzer
Beiträge
3
Hi Folks,
hier ein kleines Skript:

Code:
CREATE TABLE #databases
(
DATABASE_NAME VARCHAR(250),
DATABASE_SIZE FLOAT,
REMARKS VARCHAR(250)
)
 
INSERT #databases EXEC ('EXEC sp_databases')
 
SELECT
    DATABASE_NAME,
    DATABASE_SIZE AS '(KB)',
    ROUND(DATABASE_SIZE / 1024, 2) AS MB,
    ROUND((DATABASE_SIZE / 1024) / 1024, 2) AS GB,
    REMARKS
FROM #databases
 
DROP TABLE #databases

Damit lasse ich mir die Größen aller Datenbanken auf dem Server anzeigen.
Da als Standard die Größe in KB ausgegeben wird, werden die beiden Spalten
MB und GB mit entsprechender Umrechnung hinzugefügt.

Die Ausgabe sieht dann ungefähr so aus:

Code:
+---------------+-------+-------+-------+---------+
| DATABASE_NAME | KB    | MB    | GB    | REMARKS |
+---------------+-------+-------+-------+---------+
| Datenbank 1   |  4160 |  4.06 |  0    | NULL    |
| Datenbank 2   |  6528 |  6.38 |  0.01 | NULL    |
| ...           |  ...  |  ...  |  ...  | ...     |
+---------------+-------+-------+-------+---------+

Jetzt interessiert mich aber auch die Summe der Spalten KB, MB und GB.

Am Ende soll es wie folgt aussehen:
Code:
+---------------+-------+-------+-------+---------+
| DATABASE_NAME | KB    | MB    | GB    | REMARKS |
+---------------+-------+-------+-------+---------+
| Datenbank 1   |  4160 |  4.06 |  0    | NULL    |
| Datenbank 2   |  6528 |  6.38 |  0.01 | NULL    |
| ...           |  ...  |  ...  |  ...  | ...     |
| Summe         | 10688 | 11.44 |  0.01 |         |
+---------------+-------+-------+-------+---------+

Tja, wie mache ich das nun? ;-)

Eine View auf eine temporäre Tabelle geht ja nicht.

Mit Sum(...) komme ich nicht an die Felder KB, MB und GB,
Diese werden ja im Prinzip aus der DATABASE_SIZE nur für
die temporäre Tabelle erzeugt.

Und nu?

Danke
Dirk
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
10.014
Tja, wie mache ich das nun? ;-)

Eine View auf eine temporäre Tabelle geht ja nicht.

Mit Sum(...) komme ich nicht an die Felder KB, MB und GB,
Diese werden ja im Prinzip aus der DATABASE_SIZE nur für
die temporäre Tabelle erzeugt.

Und nu?

Danke
Dirk

Du könntest das normal berechnen (weitere Berechnung) und mit UNION drankleistern. Falls M$SQL ROLLUP kann, könntest Du baer auch das nutzen.

http://wiki.postgresql.org/wiki/Grouping_Sets


Edit: http://stackoverflow.com/questions/13990821/postgresql-equivalent-to-sqlserver-group-by-with-rollup , also M$SQL sollte es können.

Andreas
 

Tommi

Datenbank-Guru
Beiträge
290
Hallo Dirk,

beide von Andreas vorgeschlagenen Wege ermöglichen das von dir gewünschte Ergebnis.
Zu beachten ist lediglich, dass die Option "WITH ROLLUP" für jede gruppierte Spalte eine zusätzliche Aggregations-Zeile erzeugt.
So lange du also nur über eine Spalte gruppierst, erhälst du das gewünschte Ergebnis.

Viele Grüße,
Tommi
 

Dirk D

Neuer Benutzer
Beiträge
3
Ja super....genau das isses. ;-)
Mit "WITH ROLLUP" habe ich es hinbekommen.

Zwar habe ich nun einen Eintrag namens "NULL" in
der Zeile der Summen, aber das bekomme ich auch
noch geregelt.

Ach so...hier der leicht modifizierte Code:
Code:
CREATE TABLE #databases
(
DATABASE_NAME VARCHAR(250),
DATABASE_SIZE FLOAT,
REMARKS VARCHAR(250)
)
INSERT #databases EXEC ('EXEC sp_databases')
SELECT
    DATABASE_NAME,
    SUM(DATABASE_SIZE) AS '(KB)',
    SUM(ROUND(DATABASE_SIZE / 1024, 2)) AS '(MB)',
    SUM(ROUND((DATABASE_SIZE / 1024) / 1024, 2)) AS '(GB)'
FROM #databases
GROUP BY DATABASE_NAME WITH ROLLUP
DROP TABLE #databases


Vielen Dank
Dirk
 

Tommi

Datenbank-Guru
Beiträge
290
Hallo Dirk,

der NULL-Wert lässt sich leicht mit der ISNULL()-Funktion abfangen:

Code:
SELECT ISNULL(DATABASE_NAME, 'Summe') as DATABASE_NAME, ...

Viele Grüße,
Tommi
 
Werbung:
Oben