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

ny_unity

Datenbank-Guru
Beiträge
133
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Ist das irgendwie machbar? Ich greife mit dem SQL management Studio auf ein Firebird Server zu.

Vielen Dank.

Erik


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

Datenbank-Guru
Beiträge
133
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:)
 

ny_unity

Datenbank-Guru
Beiträge
133
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!
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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:)

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.
 

ukulele

Datenbank-Guru
Beiträge
4.394
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

Datenbank-Guru
Beiträge
133
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!!!
 

ukulele

Datenbank-Guru
Beiträge
4.394
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

Datenbank-Guru
Beiträge
133
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 .-)
 

ny_unity

Datenbank-Guru
Beiträge
133
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
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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?

Danke
Erik


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

Datenbank-Guru
Beiträge
133
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 ;)
 
Werbung:
Oben