Benutzer mit den meisten Antworten
SSRS bdedingte Filterung

Frage
-
Hallo,
ich habe folgende Konstellation (SQL 2008):
Ein Dataset mit Artikel, Preisgruppe und Preis soll in einer Matrix dargestellt werden, Artikel in den Zeilen, Preisgruppe in den Spalten und und Preis in den Details. Dabei sollen nur Zeilen angezeigt werden, in denen einer der Preise 10% unter dem Durchschnitt liegt. Kann man das im Report realisieren?
Für jeden Tipp dankbar
Gruß Ulf
Antworten
-
Hallo Ulf,
ohne ein DDL ist es natürlich schwer, eine klare Antwort zu geben. Aber unter der Annahme, dass Deine Tabelle folgendes Schema hat
CREATE TABLE dbo.tbl_app_Artikel ( ArtikelNo varchar(10) NOT NULL PRIMARY KEY, ArtikelName varchar(50) NOT NULL, Preisgruppe varchar(10) NOT NULL, Preis money NOT NULL DEFAULT (0) )
würde es wie folgt funktionieren:
VORSICHT! Luftcode. Ich habe das mal im Notepad gemacht, da ich kein SSMS zur Hand habe ;-)SELECT a.Artikel, CASE WHEN a.PreisGruppe = 'A' THEN a.Preis ELSE NULL END AS [Preisgruppe A], CASE WHEN a.PreisGruppe = 'B' THEN a.Preis ELSE NULL END AS [Preisgruppe B], ... FROM dbo.tbl_app_Artikel a INNER JOIN (SELECT PreisGruppe, AVG(Preis) FROM dbo.tbl_app_Artikel) t ON ( a.PreisGruppe = t.PreisGruppe AND a.Preis <= t.Preis )
Uwe Ricken
Microsoft Certified Database Administrator SQL Server 2005
db Berater GmbH
http://www-db-berater.de- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. September 2010 12:14
-
Wen Du es in einer Prozedur machst, kannst Du mit dynamischem SQL auch unterschiedliche Anzahl Preisgruppen abhandeln.
Wenn Du bis morgen Zeit hast, kann ich Dir ein Beispiel geben.
Allerdings hast Du dann das Problem, daß die Datasource für den Report nicht mehr paßt.
So, hier der Code, den Du an Deine Bedürfnisse anpassen kannst:
--Tabelle vorher immer löschen, da u.U. neue Preisgruppen dazukommen könnten
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T_XTabArtikelpreis]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[T_XTabArtikelpreis]
-- Tabelle mit "Select into" erstellen
declare @sql varchar(8000)
declare @spaltenname varchar(50)
set @sql =
'SELECT Mandant,
Filiale,
Artikelnr,
max(PreisGruppe) as Preisgruppe,
max(WaehrungCode) as WaehrungCode,
max(GueltigAb) as GueltigAb,
max(PreisEinheit) as PreisEinheit,
max(PEFaktorCode) as PEFaktorCode'
declare spalten cursor for select Kurzbez from dbo.v_Preisgruppe group by Kurzbez
open spalten
fetch next from spalten into @spaltenname
while @@fetch_status = 0
begin
set @sql = @sql + ', max(case Kurzbez when ''' + @spaltenname + ''' then Artikelpreis else 0 end) as [' + @spaltenname + ']'
fetch next from spalten into @spaltenname
end
close spalten
deallocate spalten
set @sql = @sql + ' into T_XTabArtikelpreis FROM v_ArtikelpreisMitGruppe GROUP BY Mandant, Filiale, Artikelnr'
--print @sql
exec(@sql)- Bearbeitet Christa Kurschat Freitag, 27. August 2010 06:24 Code zugefügt
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. September 2010 12:14
Alle Antworten
-
Hallo Ulf,
ohne ein DDL ist es natürlich schwer, eine klare Antwort zu geben. Aber unter der Annahme, dass Deine Tabelle folgendes Schema hat
CREATE TABLE dbo.tbl_app_Artikel ( ArtikelNo varchar(10) NOT NULL PRIMARY KEY, ArtikelName varchar(50) NOT NULL, Preisgruppe varchar(10) NOT NULL, Preis money NOT NULL DEFAULT (0) )
würde es wie folgt funktionieren:
VORSICHT! Luftcode. Ich habe das mal im Notepad gemacht, da ich kein SSMS zur Hand habe ;-)SELECT a.Artikel, CASE WHEN a.PreisGruppe = 'A' THEN a.Preis ELSE NULL END AS [Preisgruppe A], CASE WHEN a.PreisGruppe = 'B' THEN a.Preis ELSE NULL END AS [Preisgruppe B], ... FROM dbo.tbl_app_Artikel a INNER JOIN (SELECT PreisGruppe, AVG(Preis) FROM dbo.tbl_app_Artikel) t ON ( a.PreisGruppe = t.PreisGruppe AND a.Preis <= t.Preis )
Uwe Ricken
Microsoft Certified Database Administrator SQL Server 2005
db Berater GmbH
http://www-db-berater.de- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. September 2010 12:14
-
Ja, so ungefähr kann es klappen. Das bedingt halt eine feste Anzahl von Preisgruppen, die bei uns nicht unbedingt gegeben ist. Dann muß ich bei jeder Änderung der Preisgruppen auch diesen Code ändern. Scheint aber nicht anders zu gehen.
Danke Ulf
-
Wen Du es in einer Prozedur machst, kannst Du mit dynamischem SQL auch unterschiedliche Anzahl Preisgruppen abhandeln.
Wenn Du bis morgen Zeit hast, kann ich Dir ein Beispiel geben.
Allerdings hast Du dann das Problem, daß die Datasource für den Report nicht mehr paßt.
So, hier der Code, den Du an Deine Bedürfnisse anpassen kannst:
--Tabelle vorher immer löschen, da u.U. neue Preisgruppen dazukommen könnten
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T_XTabArtikelpreis]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[T_XTabArtikelpreis]
-- Tabelle mit "Select into" erstellen
declare @sql varchar(8000)
declare @spaltenname varchar(50)
set @sql =
'SELECT Mandant,
Filiale,
Artikelnr,
max(PreisGruppe) as Preisgruppe,
max(WaehrungCode) as WaehrungCode,
max(GueltigAb) as GueltigAb,
max(PreisEinheit) as PreisEinheit,
max(PEFaktorCode) as PEFaktorCode'
declare spalten cursor for select Kurzbez from dbo.v_Preisgruppe group by Kurzbez
open spalten
fetch next from spalten into @spaltenname
while @@fetch_status = 0
begin
set @sql = @sql + ', max(case Kurzbez when ''' + @spaltenname + ''' then Artikelpreis else 0 end) as [' + @spaltenname + ']'
fetch next from spalten into @spaltenname
end
close spalten
deallocate spalten
set @sql = @sql + ' into T_XTabArtikelpreis FROM v_ArtikelpreisMitGruppe GROUP BY Mandant, Filiale, Artikelnr'
--print @sql
exec(@sql)- Bearbeitet Christa Kurschat Freitag, 27. August 2010 06:24 Code zugefügt
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. September 2010 12:14
-
Hallo Ulf,
wie Christa bereits ausgeführt hat, geht es natürlich auch mittels dynamischem SQL. Das wird Dir aber bei der Reportdefinition nicht helfen. Da ja die Dynamik auch in den Reports wiedergegeben werden muss.
Das Problem ist noch nicht einmal die Anzahl der Spalten sondern vielmehr deren Bezeichnung, wie sie im Report angegeben werden soll.
Da Du aber in jedem Fall den Report entsprechend anpassen mußt, kannst Du auch gleich die entsprechende Datengrundlage (Proc / View) anpassen.
PS: Ich habe in meinem Beispiel ein GROUP BY PreisGruppe vergessen (in der inneren Abfrage!)
Uwe Ricken
Microsoft Certified Database Administrator SQL Server 2005
db Berater GmbH
http://www-db-berater.de