Announcement

Collapse
No announcement yet.

2 Zeilen einer Spalte verbinden

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

  • 2 Zeilen einer Spalte verbinden

    Moinsen,

    bin SQL Neuling und hab direkt mit einem Verbindungsproblem zu tun.

    Also, ich möchte 2 Zeilen einer Spalte in einer seperaten Spalte verbinden.


    Soweit bin ich:
    Die Zeilen sind in einer Extraspalte [Info], allerdings muss ich das ganze in Stored Procedures machen.

    ------------------------------------
    Das ist die Tabelle (ein Beispiel):

    +--------------+---------------+-------------+-------------+
    |....datum_1....|.datum_2.....|.text..........|.ID .............|
    +--------------+---------------+-------------+-------------+
    |....20091112..|.20101224...|.feiern wir.|....220022.....|
    +--------------+---------------+-------------+-------------+
    |....20100820..|.20110429...|.gehen wir|....121212.....|
    +--------------+---------------+-------------+-------------+

    ------------------------------------

    Soweit habe ich es:

    SELECT


    SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 0) + 'Vom ' +
    SUBSTRING(CONVERT(VARCHAR(50), datum_1), 7, 2) + '.' +
    SUBSTRING(CONVERT(VARCHAR(50), datum_1), 5, 2) + '.' +
    SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 5) + ' bis ' +

    SUBSTRING(CONVERT(VARCHAR(50), datum_2), 7, 2) + '.' +
    SUBSTRING(CONVERT(VARCHAR(50), datum_2), 5, 2) + '.' +
    SUBSTRING(CONVERT(VARCHAR(50), datum_2), 0, 5) + ' ' +

    SUBSTRING(CONVERT(VARCHAR(50), text), 0, 13) + ';'



    AS Extratext


    FROM [*Datenbank*]
    WHERE [ID] = 220022 or [ID] = 121212

    ------------------------------------

    Ausgabe:

    +--------------+--------------------------------------------------------------+
    |...................|...Extratext................. ............................................|
    +--------------+--------------------------------------------------------------+
    |.......1..........|.Vom 12.11.2009 bis 24.12.2010 feiern wir.;...............|
    +--------------+--------------------------------------------------------------+
    |.......2..........|.Vom 20.10.2008 bis 29.04.2011 gehen wir ;..............|
    +--------------+--------------------------------------------------------------+

    ------------------------------------

    Nun muss das alles in Stored Procedures.
    Wenn das soweit alles ok wäre müsste das aber am Ende so aussehen:

    +--------------+--------------------------------------------------------------+
    |...................|...Extratext................. ............................................|
    +--------------+--------------------------------------------------------------+
    |......1...........|.Vom 12.11.2009 bis 24.12.2010 feiern wir.;Vom.........|
    |...................|. 20.10.2008 bis 29.04.2011 gehen wir ;.....................|
    +--------------+--------------------------------------------------------------+

    ------------------------------------

    Das wäre mein Ziel halt.

    Ich bitte um Erklärungen für Dummies und
    Vielen Dank bereits im Voraus.

  • #2
    Du solltest vielleicht auch dein DBMS dazuschreiben. Stored Procedures sind nicht normiert und sind Herstellerspezifisch.

    Beispiel:

    Oracle -> PL/SQL
    Microsoft -> TSQL
    ...

    Comment


    • #3
      xD sorry

      Microsoft SQL

      Comment


      • #4
        Hallo,

        für MS-SQL kann ich keine konkrete Hilfe geben. Aber folgende Hinweise sind sicher nützlich:

        1. Handelt es sich bei den Datumsangaben wirklich um DATE-Felder (von welchem MS-Typ auch immer)? Dann kannst du dir die seltsame Konstruktion mit SUBSTRING und CONVERT schenken. Nimm eine passende CONVERT-Version, die ein Datum in einen String dd.mm.yyyy (oder wie auch immer) verwandelt, und setze alles mit '+' hintereinander.

        2. Woher kommen die laufenden Nummern? Handelt es sich um ROW_NUMBER (oder wie auch immer das bei MS-SQL heißt)?

        3. Woher soll deine SP wissen, ob es sich um eine neue Nummer handelt oder die vorherige weiterhin gilt?

        Gruß Jürgen

        Comment


        • #5
          Originally posted by F60.2 View Post
          M

          ------------------------------------
          Das ist die Tabelle (ein Beispiel):

          +--------------+---------------+-------------+-------------+
          |....datum_1....|.datum_2.....|.text..........|.ID .............|
          +--------------+---------------+-------------+-------------+
          |....20091112..|.20101224...|.feiern wir.|....220022.....|
          +--------------+---------------+-------------+-------------+
          |....20100820..|.20110429...|.gehen wir|....121212.....|
          +--------------+---------------+-------------+-------------+
          Wenn denn Deine Datümer vom Typ Char sind: [HIGHLIGHT="SQL"]SELECT 'Vom ' +CONVERT(CHAR(10), CONVERT (Datum_1, 112), 104)
          + ' bis ' +CONVERT(CHAR(10), CONVERT (Datum_2, 112), 104)[/HIGHLIGHT]
          Ausgabe:

          +--------------+--------------------------------------------------------------+
          |...................|...Extratext................. ............................................|
          +--------------+--------------------------------------------------------------+
          |.......1..........|.Vom 12.11.2009 bis 24.12.2010 feiern wir.;...............|
          +--------------+--------------------------------------------------------------+
          |.......2..........|.Vom 20.10.2008 bis 29.04.2011 gehen wir ;..............|
          +--------------+--------------------------------------------------------------+

          ------------------------------------

          Nun muss das alles in Stored Procedures.
          Wenn das soweit alles ok wäre müsste das aber am Ende so aussehen:

          +--------------+--------------------------------------------------------------+
          |...................|...Extratext................. ............................................|
          +--------------+--------------------------------------------------------------+
          |......1...........|.Vom 12.11.2009 bis 24.12.2010 feiern wir.;Vom.........|
          |...................|. 20.10.2008 bis 29.04.2011 gehen wir ;.....................|
          +--------------+--------------------------------------------------------------+
          wie das geht steht da: http://entwickler-forum.de/showthrea...light=Z%FCrich

          Comment


          • #6
            Also danke schonmal soweit an alle, hab eben etwas weitergefummelt und nu gehts, zumindest die Testversion


            --------------------------------

            USE [DB_DIST06]
            GO

            SET ANSI_NULLS ON
            GO
            SET QUOTED_IDENTIFIER ON
            GO

            ALTER PROCEDURE [*Datenbank/Tabelle*]

            @id1 VARCHAR(50),
            @id2 VARCHAR(50),


            AS
            declare
            @infoa VARCHAR(100),
            @infob VARCHAR(100),
            @infoG VARCHAR(100)

            BEGIN

            SELECT @infoa =

            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 0) + 'Vom ' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 7, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 5, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 5) + ' bis ' +

            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 7, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 5, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 0, 5) + ' ' +

            SUBSTRING(CONVERT(VARCHAR(50), text), 0, 13) + ';'

            FROM [*Datenbank/Tabelle*]

            WHERE [ID] = @id1


            SELECT @infob =


            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 0) + 'Vom ' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 7, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 5, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_1), 0, 5) + ' bis ' +

            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 7, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 5, 2) + '.' +
            SUBSTRING(CONVERT(VARCHAR(50), datum_2), 0, 5) + ' ' +

            SUBSTRING(CONVERT(VARCHAR(50), text), 0, 13) + ';'

            FROM [*Datenbank/Tabelle*]
            WHERE [ID] = @id2


            select @infoG = @infoa + @infob

            print @infoG

            END

            ------------------------

            Das Ergebniss soll laut meinem Auftrag nämlich als Text dargestellt werden.

            Nun aber mein zweites Problem:

            Es können von einer ID mehrere Infos kommen, und nur die sollen zusammengenommen werden, also "n" Nachrichten zu einer ID.

            Wie stell ich das am besten um?

            Comment


            • #7
              ... und später, wenn du mal nicht mehr SQL-Neuling bist, wirst du das vielleicht so schreiben:

              SELECT @infob = 'Vom ' + convert(varchar,convert(datetime,cast(@datum_1 as varchar)),104) + ' bis ' + convert(varchar,convert(datetime,cast(@datum_2 as varchar)),104) + SUBSTRING(text, 1, 12) ...

              Das geht aber nur, wenn das Datum als integer in der Form JJJJMMTT gespeichert ist. Dazu kleine Erklärung: das Integer-Datum wird mit CAST zu einem String umgewandelt, dieser in einen Datumswert und der mit CONVERT dann in den Ergebnisstring, dabei ist der 3. Parameter, also das 104, entscheidend.


              Noch eine Bemerkung:
              a) ich hoffe das Feld "text" ist nicht vom typ TEXT sondern VARCHAR, außer du hast einen bestimmten Grund dazu, dann bei TEXT gehen einige Zeichenfolgefunktionen nicht!
              b) man nennt eine Spalte nicht "text", da dass ein reserviertes Wort ist (eben ein Datentyp). Machen kann man es zwar, aber das kann später mal zu Problemen führen. Also besser anderen Namen verwenden.


              Und wegen der Folgefrage mit mehreren Ergebnissen zu einer ID:
              Ich bin jetzt nicht sicher, was du genau meinst. Kannst du da auch ein kleines Beispiel für ein Ergebnis zeigen?

              bye,
              Helmut

              Comment


              • #8
                ... und später, wenn du mal nicht mehr SQL-Neuling bist, wirst du das vielleicht so schreiben:

                SELECT @infob = 'Vom ' + convert(varchar,convert(datetime,cast(@datum_1 as varchar)),104) + ' bis ' + convert(varchar,convert(datetime,cast(@datum_2 as varchar)),104) + SUBSTRING(text, 1, 12) ...
                Danke Helmut, aber nach 4 Tagen SQL erwartet nicht mal mein Ausbilder sowas xDDD

                Das geht aber nur, wenn das Datum als integer in der Form JJJJMMTT gespeichert ist.
                Ist es.

                a) ich hoffe das Feld "text" ist nicht vom typ TEXT sondern VARCHAR, außer du hast einen bestimmten Grund dazu, dann bei TEXT gehen einige Zeichenfolgefunktionen nicht!
                b) man nennt eine Spalte nicht "text", da dass ein reserviertes Wort ist (eben ein Datentyp). Machen kann man es zwar, aber das kann später mal zu Problemen führen. Also besser anderen Namen verwenden.
                Ich hab das nur als Beispiel genommen, weil mir nix besseres eingefallen ist ^^ aber ich wusste ja auch nicht das TEXT ein eigener Typ is ("wieder was gelernt ^°)

                Ich bin jetzt nicht sicher, was du genau meinst. Kannst du da auch ein kleines Beispiel für ein Ergebnis zeigen?
                Sicher doch:

                ID || Beispiel
                1 | eintext
                1 | einbeispiel
                2 | tutnichts

                und wenn man nun die ID 1 ausgibt kommt:

                eintext;einbeispiel

                Comment


                • #9
                  Klar, nach 4 Tagen kann man gerade mal einen Überblick über die Möglichkeiten haben, da verstehe ich aber dann die zweite Frage nicht, die ist nämlich selbst für Nicht-Neulinge keine einfache Sache. Kannst dir ja den Thread dazu mal hier durchlesen. Kann mir aber nicht vorstellen, dass sowas nach 4 Tagen verlangt wird. Irgendwie muss die Anforderung einfacher sein, zB. dass es nur maximal einen zweiten Eintrag zur gleichen ID geben kann oder so.

                  bye,
                  Helmut

                  Comment


                  • #10
                    @ Helmut
                    Danke für die Antwort und Anteilnahme ^°
                    Werde mir das nun zu Gemüte führen, war ein Monat nicht am werkeln.

                    Comment

                    Working...
                    X