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

SQL Server im View eine Ergebniszeile anzeigen .. mehr auf http://w-w-w.ms/a4cu0c

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von ny_unity, 21 August 2013.

  1. ny_unity

    ny_unity Datenbank-Guru

    Hallo zusammen,

    bin neu hier im Forum und hoffe das ich mein Anliegen verständlich ausgedrückt habe:

    also wie schon im Betreff erwähnt, habe ich einen View, der wie folgt aufgebaut ist:

    Status - Anzahl
    Status1 - 5
    Status2 - 10
    Status3 - 100

    Jetzt möchte ich, das der View wie folgt ergänzt wird:

    Status - Anzahl - Anteil
    Status1 - 5 - 4,35%
    Status2 - 10 - 8,70%
    Status3 - 100 - 86,96%
    Anzahl: 115

    Von mir aus kann die 115 auch ganz oben stehen :)

    Ist das irgendwie machbar? Ich greife mit dem SQL management Studio auf ein Firebird Server zu.

    Vielen Dank.

    Erik
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Code:
    test=*# select * from ny_unity ;
     status  | anzahl
    ---------+--------
     status1 |      5
     status2 |     10
     status3 |    100
    (3 rows)
    
    test=*# select *, (100 * anzahl::numeric / sum (anzahl) over ())::numeric(5,2)::text || '%' from ny_unity union all select 'Anzahl: ' || sum(anzahl)::text, null, null from ny_unity;
       status    | anzahl | ?column?
    -------------+--------+----------
     status1     |      5 | 4.35%
     status2     |     10 | 8.70%
     status3     |    100 | 86.96%
     Anzahl: 115 |        |
    (4 rows)
    
    gemacht mit PostgreSQL.
     
    ny_unity gefällt das.
  3. ny_unity

    ny_unity Datenbank-Guru

    Hallo akretschmer,

    danke für deine Antwort.

    Kannst du mir die Schritte kurz erklären was du wann gemacht hast?Weil ich verstehe nicht ganz alles. Was bedeuten die ::?

    Vielen Dank!

    Erik:)
     
  4. ny_unity

    ny_unity Datenbank-Guru

    aktuell habe ich die Abfrage wie folgt:
    Code:
    CREATE VIEW [dbo].[vw_Status]
    AS
    SELECT * FROM OPENQUERY(Tabelle, 'select *, (100 * t5.anzahl / sum (t5.anzahl) over ())numeric(5,2)text || ''%'' from t5 union all select ''Anzahl'' || sum(t5.Anzahl)::text, null, null from
                (select t4.bezeichn, count(t4.bezeichn) as Anzahl from
                (select t3.personalnr, iif(t2.bezeichn is null, ''Produktiv'', t2.bezeichn) as Bezeichn
                FROM (select t1.personalnr, t1.bezeichn from tabelle1 t1 where t1.datumvon <= timestamp ''TODAY'' and t1.datumbis >= timestamp ''TODAY'' and t1.berufschl is null) t2
                right join tabelle3 t3 on t2.personalnr = t3.personalnr
                where t3.internpers = ''N'' and t3.persstatus = ''2'') t4
                group by t4.bezeichn) t5'
    habe ich da was falsch verstanden? Das haut nicht hin :( Greife wie gesagt auf nen Firebird zu... Danke!
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Die :: sind einfach nur CAST-Operatoren, weil sonst int geteilt durch int wieder int und damit in dem Falle 0 ergäben hätte. Der Rest ist doch einfach, oder? sum() over () ist halt eine Window-Funktion, die hier alles umfaßt. Du fragst im M$SQL-Forum, scheinst aber Firebird zu verwenden. Ob diese das können weiß ich nicht, MySQL kann es jedenfalls nicht.
     
    ny_unity gefällt das.
  6. ukulele

    ukulele Datenbank-Guru

    Ganz so einfach wäre es auch mit MSSQL nicht den da muss man schon mit cast() arbeiten und kann || auch nicht verwenden.
    Code:
    SELECT    unt_bez_lang,
            id,
            cast(cast(( 10000 * id / sum (id) OVER () ) AS NUMERIC(7,2)) / 100 AS NUMERIC(5,2)) AS [%]
    FROM    unt
    UNION ALL
    SELECT    'Summe: ' + cast(sum(id) AS VARCHAR(20)),
            NULL,
            100
    FROM    unt
     
    ny_unity gefällt das.
  7. ukulele

    ukulele Datenbank-Guru

    Jetzt hab ich mit IDs gerechnet, sry :)
     
    akretschmer gefällt das.
  8. ny_unity

    ny_unity Datenbank-Guru

    dann versuche ich mal die ID mit Anzahl zu tauschen, ich melde mich dann nochmal, danke!
     
  9. ny_unity

    ny_unity Datenbank-Guru

    Code:
    CREATE VIEW [dbo].[vw_Statusübersicht]
    AS
    SELECT t5.bezeichn as Status, t5.Anzahl, cast(cast(( 10000 * t5.anzahl / sum (t5.anzahl) OVER () ) AS NUMERIC(7,2)) / 100 AS NUMERIC(5,2)) AS [%]
                                    FROM [dbo].[vw_Status] t5
                                    UNION ALL
                                    SELECT    'Summe: ' + cast(sum(t5.anzahl) AS VARCHAR(20)),
                                    NULL,
                                    100
                                    FROM [dbo].[vw_Status] t5
     
     
    GO
    das habe ich jetzt so hinbekommen, doch kann mir einer die Syntax für Firebird sagen? Dann hätte ich es perfekt :)

    Vielen Dank!!!
     
  10. ukulele

    ukulele Datenbank-Guru

    Nein leider nicht. akretschner postet immer PostgreSQL Syntax, da das hier das MS SQL Forum ist habe ich das auf MS umgebaut. Was Firebird jetzt unterstützt (vermutlich kein OVER(), eventuell kein UNION ALL) das musst du leider noch raus finden. Statt OVER() kann man aber auch einen Subselect verwenden.
     
    ny_unity gefällt das.
  11. ny_unity

    ny_unity Datenbank-Guru

    ok, ich werd mal googlen, aber vielen herzlichen dank schonmal, ansonsten mach ich halt nen SQL view und arbeite mit dem dann weiter... ist zwar etwas zeitverlust aber da das ganze noch unter 1s läuft für den normalen Arbeiter nicht spührbar .-)
     
  12. ny_unity

    ny_unity Datenbank-Guru

    huhu, ich nochmal,

    mir fällt auf, dass bei % immer falsch gerundet wird, ich komme nie auf 100%... Ich habe das jetzt um ein paar Zeilen erweitert, doch da wird nie mit den Nachkommastellen gerechnet, woran kann das liegen?
    Code:
    CREATE VIEW [dbo].[vw_Statusuebersicht]
    AS
    SELECT t5.bezeichn as Status, t5.Anzahl, cast(cast(( 10000 * t5.anzahl / sum (t5.anzahl) OVER () ) AS NUMERIC(7,2)) / 100 AS NUMERIC(5,2)) AS [%]
                                    FROM [dbo].[vw_Status] t5
                                    UNION ALL
                                    SELECT    'Summe: ',
                                    sum(t5.anzahl),
                                    100
                                    FROM [dbo].[vw_Status] t5
                                    UNION ALL
                                    Select        'Produktiv:',
                                    sum(t6.Anzahl),
                                    cast(sum(t6.Anzahl)*100/sum(t5.anzahl) as NUMERIC(7,2))
                                    from [dbo].[vw_Status] t5 left join (Select t5.anzahl as Anzahl, t5.BEZEICHN from [dbo].[vw_Status] t5 where t5.BEZEICHN = 'Produktiv') t6 on t6.BEZEICHN = t5.BEZEICHN
                                    UNION ALL
                                    Select        'Unproduktiv:',
                                    sum(t7.Anzahl),
                                    sum(t7.Anzahl)*100/sum(t5.anzahl)
                                    from [dbo].[vw_Status] t5 left join (Select t5.anzahl as Anzahl, t5.BEZEICHN from [dbo].[vw_Status] t5 where t5.BEZEICHN <> 'Produktiv') t7 on t7.BEZEICHN = t5.BEZEICHN
    Danke
    Erik
     
  13. akretschmer

    akretschmer Datenbank-Guru


    Das hab ich Dir schon beantwortet, bevor Du das gefragt hast ;-)

    Siehe weiter oben: "Die :: sind einfach nur CAST-Operatoren, weil sonst int geteilt durch int wieder int und damit in dem Falle 0 ergäben hätte".
     
    ny_unity gefällt das.
  14. ny_unity

    ny_unity Datenbank-Guru

    Code:
    cast(cast(cast(sum(t6.Anzahl)as Numeric(7,2))*100 as Numeric(7,2))/cast(sum(t5.anzahl) as Numeric(7,2)) as Numeric(7,2))
    ich bin mal auf nummer sicher gegangen und habe alles gecastet^^ jetzt gehts, danke ;)
     
  15. ukulele

    ukulele Datenbank-Guru

    Bisher sind es ja auch nur 2 Nachkommastellen, mit 4 solltest du ziemlich nah an 100 bzw genau auf 100 kommen.
     
    ny_unity 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