Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Summe auf temporäre Tabelle

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Dirk D, 22 April 2013.

  1. Dirk D

    Dirk D Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. Tommi

    Tommi Datenbank-Guru

    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
     
  4. Dirk D

    Dirk D Neuer Benutzer

    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
     
  5. Tommi

    Tommi Datenbank-Guru

    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
     
  6. Dirk D

    Dirk D Neuer Benutzer

    Ja super. Ist ja ein Traum, wie das hier läuft :)

    Dirk
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden