Announcement

Collapse
No announcement yet.

Transponieren für DTA Datei

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

  • Transponieren für DTA Datei

    Hallo

    Ich habe eine Datei mit Datensätzen, mit denen im Endausbau eine DTA Datei
    erstellt werden soll.
    Beispiel:


    Name Vorname Bankkonto BLZ Gutschriftsnummer Betrag
    Meier Hans 342875982 70080000 4441 70,00
    Müller Bruno 3498502 70090000 4442 70,00
    Zeller Brigitte 34587 70070010 4443 70,00
    Meier Hans 342875982 70080000 4444 70,00
    Filser Thomas 394570239 70040030 4445 70,00
    Meier Hans 342875982 70080000 4446 70,00

    Der Meier kommt drei mal vor
    Ich brauche nun einen select, der den Meier gruppiert und die Gutschrifsnummern in einer Spalte (später als Verwendungszweck) wiedergibt.

    Also wäre das Ergebnis:

    Name Vorname Bankkonto BLZ Gutschriftsnummer Betrag
    Meier Hans 342875982 70080000 4441 /4444 /4446 210,00
    Müller Bruno 3498502 70090000 4442 70,00
    Zeller Brigitte 34587 70070010 4443 70,00
    Filser Thomas 394570239 70040030 4445 70,00

    Ist das ganze möglich, ohne etwas in eine Zwischendatei zu schreiben?

    Würde mir sehr weiterhelfen. Der Select wird in ein C Programm eingebunden, das die DTAUS Datei erstellt. Hat schon mal jemand über SQL eine DTAUS Datei gebaut?

  • #2
    Mit einem einzigen Select-Statement ist das meines Wissens nach nicht möglich. Aber warum keine stored procedure schreiben? Das C-Programm ruft diese auf und erhält das fertige Resultset als Ergebnis. Die erforderliche Schritte laufen alle am Server in der stored proc und so gesehen ist es dann für das C-Programm ein einziger SQL-Befehl ohne Zwischentabelle.

    bye,
    Helmut

    Comment


    • #3
      Transponieren für DTA Datei

      Hallo Helmut

      Könnte man machen. So weit reichen meine Kenntnisse leider nicht.
      Wäre sowas aufwendig. bzw. kannst du mir eine Lösung vorschlagen?


      Gruß

      BUBA

      Comment


      • #4
        Ist eigentlich gar nicht so schwer:
        Du nimmst ein Tool wie Management Studio Express, öffnest die Datenbank, gehst dann zu -> Programmierbarkeit -> Funktionen -> mit rechter Maustaste auf "Skalarwertfunktionen" klicken -> neue Skalarwertfunktion -> dann dort eingeben:
        Code:
        create function leseGutschriften (@bankkonto bigint)
        returns varchar(2000) as
        begin
        declare @s varchar(2000)
        select @s = IsNull(@s + ', ','') + cast(Gutschriftsnummer as varchar(30))
          from tabelle where bankkonto = @bankkonto
        return @s
        end
        Das dann einmal ausführen, damit ist eine UDF angelegt, die im select so verwendet werden kann:
        Code:
        select t1.Name, t1.Vorname, t1.Bankkonto,  t1.BLZ,
          dbo.LeseGutschriften(t1.Bankkonto) as Gutschriften, sum(t2.Betrag) as Betrag
        from tabelle as t1 left join tabelle as t2 where t2.Bankkonto = t1.Bankkonto
        Ich habe es jetzt mal mit Bankkonto als eindeutigen Schlüssel aufgebaut (Name würde ich nicht nehmen) und das kann natürlich beliebig geändert/erweitert werden. Auch bei den Datentypen (Bankkonto als bigint, Gutschriften auch irgendwas numerisches und daher cast auf varchar) habe ich einfach mal Annahmen getroffen, die du noch entsprechend anpassen solltest.

        bye,
        Helmut

        Comment


        • #5
          Transponieren für DTA Datei

          Hallo Helmut,

          Herzlichen Dank,

          Ich werde es testen. Eindeutig ist die Kundennummer, die habe ich unterschlagen.

          Ich hoffe ich kann das mit den Zugriffen auf die Datenbank klären.

          Gruß

          BUBA

          Comment


          • #6
            Mit SQL geht das so:

            CREATE TABLE #Test ( ID INTEGER IDENTITY (1,1) NOT NULL PRIMARY KEY
            , NachName VARCHAR (50)
            , VorName VARCHAR (50)
            , KtoNr VARCHAR (20)
            , BLZ VARCHAR (8)
            , GutSchriftnr VARCHAR (12)
            , GutSchriftBetrag NUMERIC (12,2)
            );

            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Meier', 'Hans', '342875982', '70080000', '4441', 70.00);
            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Müller', 'Bruno', '3498502', '70090000', '4442', 70.00);
            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Zeller', 'Brigitte', '34587', '70070010', '4443', 70.00);
            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Meier', 'Hans', '342875982', '70080000', '4444', 70.00);
            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Filser', 'Thomas', '394570239', '70040030', '4445', 70.00);
            INSERT INTO #TEST (NachName, Vorname, KtoNr, BLZ, Gutschriftnr, GutSchriftBetrag) VALUES ('Meier', 'Hans', '342875982', '70080000', '4446', 70.00);


            SELECT Distinct NachName, Vorname, LEFT(GuschriftenListe
            , LEN(GuschriftenListe)-1) AS GuschriftenListe
            FROM #test t
            CROSS APPLY
            (SELECT GutSchriftnr + ','
            FROM #Test tList
            where tList.Vorname = t.Vorname AND tList.Nachname = t.Nachname
            ORDER BY T.GutSchriftnr
            FOR XML PATH('')) AS x(GuschriftenListe)

            ergibt

            NachName Vorname GuschriftenListe
            --------------- --------------- ------------------
            Filser Thomas 4445
            Meier Hans 4441,4444,4446
            Müller Bruno 4442
            Zeller Brigitte 4443

            (4 Zeile(n) betroffen)

            Comment


            • #7
              bzw . mit Summierung der Gutrschriften

              SELECT NachName, Vorname, KtoNr, BLZ , SUM (GutSchriftBetrag) AS SummeGutschriften,
              LEFT(GuschriftenListe, LEN(GuschriftenListe)-1) AS GuschriftenListe
              FROM #test t
              CROSS APPLY (SELECT GutSchriftnr + ','
              FROM #Test tList
              WHERE tList.Vorname = t.Vorname AND tList.Nachname = t.Nachname
              ORDER BY T.GutSchriftnr
              FOR XML PATH('')
              ) AS x(GuschriftenListe)
              GROUP BY NachName, Vorname, KtoNr, BLZ , LEFT(GuschriftenListe, LEN(GuschriftenListe)-1)

              NachName Vorname KtoNr BLZ SummeGutschriften GuschriftenListe
              ---------- ----------- ---------- -------- ------------------ ------------------
              Filser Thomas 394570239 70040030 70.00 4445
              Meier Hans 342875982 70080000 210.00 4441,4444,4446
              Müller Bruno 3498502 70090000 70.00 4442
              Zeller Brigitte 34587 70070010 70.00 4443

              (4 Zeile(n) betroffen)

              Comment


              • #8
                Transponieren für DTA

                Habe die Lösung von Helmut umgesetzt. Danke, das mit der funktion ist wirklich gut und eine Lösung mit wenig Text.

                Gruß

                Buba

                Comment

                Working...
                X