none
SSRS bdedingte Filterung RRS feed

  • 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

    Mittwoch, 25. August 2010 19:02

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:

    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
          )
    
    VORSICHT! Luftcode. Ich habe das mal im Notepad gemacht, da ich kein SSMS zur Hand habe ;-)
    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Donnerstag, 26. August 2010 13:09
  • 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)

    Donnerstag, 26. August 2010 18:45

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:

    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
          )
    
    VORSICHT! Luftcode. Ich habe das mal im Notepad gemacht, da ich kein SSMS zur Hand habe ;-)
    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Donnerstag, 26. August 2010 13:09
  • 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

    Donnerstag, 26. August 2010 15:37
  • 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)

    Donnerstag, 26. August 2010 18:45
  • 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
    Freitag, 27. August 2010 10:15
  • Danke Christa.

    Ich versuche mal, den Code an meine DB anzupassen. Sollte ich noch Fragen haben, melde ich mich.

    Ansonsten ein schönes Wochenende

    Gruß Ulf

     

    Freitag, 27. August 2010 10:17