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

ny_unity

SQL-Guru
Beiträge
185
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:
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.
 
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:)
 
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!
 
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.
 
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
 
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!!!
 
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.
 
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 .-)
 
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
 
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".
 
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:
Zurück
Oben