Announcement

Collapse
No announcement yet.

Dynamischen Spalten in einer SQL-Query erzeugen...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dynamischen Spalten in einer SQL-Query erzeugen...

    Hallo Leute!

    Sorry wegen dem Betreff, aber was besseres ist mir nicht eingefallen

    Ich versuche mittels SSRS (SQL Server Reporting Services) Jahresübersichten zu erstellen, komme aber nicht auf eine gescheite Lösung.

    Also, in einer Datenbank werden in Tabelle 1 die Automarken festgelegt. In Tabelle 2 wird das verkaufte Auto (AutoID + Datum) eingetragen.

    Nun zum Problem:
    Ich will von jedem Jahr die Anzahl der verkauften Autos je Marke aufsummieren (siehe ganz unten) => soll dynamisch steuerbar sein z.B. nur für die Jahre 2006-2010 oder für 2003-2007 usw..

    Mit dem folgendem Code erzeuge ich für bestimmte Jahre (2006-2010) das Ergebnis:
    Code:
    SELECT
          	Marke,
            (SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang1 AND datum < @jahr_ende1 AS Autoanzahl2006,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang2 AND datum < @jahr_ende2 AS Autoanzahl2007,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang3 AND datum < @jahr_ende3 AS Autoanzahl2008,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang4 AND datum < @jahr_ende4 AS Autoanzahl2009,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang5 AND datum < @jahr_ende5 AS Autoanzahl2010
    FROM Tabelle1 b
    Ich will aber nicht nur für diese Jahre erzeugen, sondern das ganze dynamisch machen, soadass ich z.B. für 2009-2010 erzeugen kann oder von 2001-2010 usw.



    Ich habe mit temporären Tabellen versucht:
    Code:
    WHILE @dauer > 0
    BEGIN
         SELECT @dauer = @dauer - 1;
    
    SELECT
          	Marke,
            (SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang1 AND datum < @jahr_ende1 AS Autoanzahl2006,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang2 AND datum < @jahr_ende2 AS Autoanzahl2007,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang3 AND datum < @jahr_ende3 AS Autoanzahl2008,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang4 AND datum < @jahr_ende4 AS Autoanzahl2009,
    	(SELECT COUNT(AutoID) from Tabelle2 WHERE AutoID=b.ID AND datum >= @jahr_anfang5 AND datum < @jahr_ende5 AS Autoanzahl2010
    INTO #zwischenspeichern
    FROM Tabelle1 b
    
    END
    Das Problem ist, dass beim zweiten durchlauf die Spalten die gleichen Namen haben wie die davor. Und die Spalten kann ich nicht dynamisch machen. Ich habe z.B. versucht statt "As Autoanzahl2010" "@variable1" zu geben, aber das mag er nicht (und ja ich habe die Variable davor declariert).


    Mit INNER JOIN habe ich auch versucht aber klappt auch nicht, ausserdem schaffe ich es nicht dynamisch zu gestalten

    Ich bin solangsam am verzweifeln. Habe das Problem von jeder Seite schon versucht zu lösen. Jemand eine Idee? Bin über jeden Tipp dankbar!

    Hier noch ne kurze Übersicht zu den Tabellen (habe sie extra so vereinfacht).


    Tabelle 1
    Code:
    ID	Marke
    1	BMW
    2	Audi
    3	Mercedes
    4	Porsche
    5	Ferrari
    Tabelle 2:
    Code:
    AutoID	datum
    1	20090101
    1	20100303
    1	20100404
    2	20100505
    2	20090606
    2	20100707
    3	20080101
    3	20080202
    3	20100404
    4	20080505
    4	20100606
    4	20100707

    Ergebnis soll sein:
    Code:
    Marke		2010	2009	2008
    BMW		2	1	0
    Audi		2	1	0
    Mercedes	2	0	1
    Porsche		2	0	1

  • #2
    Hallo,

    was Du da vor hast nennt sich "dynamische Pivot Tabelle", siehe z.B.
    http://www.itrain.de/knowhow/sql/tsql/pivot/pivot2.asp
    http://www.simple-talk.com/community.../14/37265.aspx
    http://sqlblogcasts.com/blogs/madhiv...rver-2005.aspx

    Die Mühe kannst Du Dir aber sparen, wenn Du es in SSRS verwenden willst, das geht nicht.
    Bei den Controls wie Textfeld oder Liste musst Du die Feldnamen fest zur Entwurfszeit angeben. Wie willst Du die zur Laufzeit ändern bzw. weitere Felder/Spalten hinzufügen?

    Welche Version von SSRS nutzt Du?
    Du kannst Dir die Mühe nämlich doppelt sparen, den das Matrix Control kann Pivot Tabellen bilden; in 2005 gut und in 2008 (R2) sehr gut, dort ist es dann das Tablix (Mix aus Table und Matrix).
    Siehe z.B.:
    MSDN: Adding a Matrix (Reporting Services)
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Ich danke Dir vielmals!!! Das Matrix Control ist das was ich gebraucht habe.

      PS: Ich benutze die Version 2008.

      Danke nochmals

      Comment

      Working...
      X