Announcement

Collapse
No announcement yet.

SQL Query: Count von verschiedenen Spalten

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

  • SQL Query: Count von verschiedenen Spalten

    Hallo,
    ich habe folgende Tabelle:
    ID F1 F2 F3
    A 1 0 1
    B 1 1 0
    C 1 0 0
    In der ersten Spalte eine eindeutige ID, in den Felder 1-3 steht entweder eine 1 oder eine 0 (Datentyp Bit).
    Ich möchte nun alle IDs haben, die entweder in F1 oder F2 eine 1 stehen haben und die Summe aller 1en in F1 und F2 (falls es mindestens eine 1 gibt).
    In diesem Beispiel soll also folgendes Ergebnis zurückgeliefert werden:
    A 1
    B 2
    Hiermit klappt es nicht:
    Code:
    SELECT [ID],
           COUNT(F1),
           COUNT(F2)
    FROM [Tabelle]
    WHERE ([F1] = 1 OR [F2] = 1)
    GROUP BY [ID]
    Hat jemand einen Tipp für mich?

  • #2
    Du bildest zunächst den Basiswert mit Hilfe von 'decode' oder 'case when' oder 'iif' (je nach Möglichkeiten des DB Systems) über die Felder einer Zeile:
    Code:
     decode(f1,1,1,decode(f2,1,1,0) as myF1F2Base
    dann darüber ein
    Code:
    select keyfield, summyF1F2Base from .. group by ..
    Schau Dir dazu die Syntax von decode (Oracle) oder case (diverse Systeme) an.
    Gruß, defo

    Comment


    • #3
      CASE gibt es in Oracle auch. Möglich dass das früher nicht supported war.

      http://docs.oracle.com/cd/B19306_01/...essions004.htm

      Comment


      • #4
        Ja, ich nehm gern decode in Oracle, weil es recht kompakt ist.
        Case gibt es dort mindestens seit Version 10.
        Case ist für einen allgemeinen Ansatz wahrscheinlich aber am besten weil häufigsten verfügbar.
        Gruß, defo

        Comment


        • #5
          Hallo,

          also wenn in den Feldern tatsächlich numerische Werte stehen und kein NULL, dann würde ich das einfach so machen:

          [highlight=sql]
          SELECT ID, SUM(F1 + F2) as Summe_F1_F2
          FROM [Tabelle]
          WHERE (F1 = 1 OR F2 = 1)
          GROUP BY ID
          [/highlight]

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Danke für die schnellen Antworten.

            decode konnte ich nicht nutzen, da ich auf MS SQL bin.

            @Falk: ich habe jetzt im Prinzip deinen Ansatz genommen, allerdings ist F1 und F2 vom Typ Bit und das mag der SQL Server nicht addieren.
            Daher hab ich noch ein CASE WHEN eingebaut. Ist bisschen umständlich, aber damit klappts:

            Code:
            SELECT ID, 
            SUM(CASE WHEN F1 =1 THEN 1 ELSE 0 END) +  
            SUM(CASE WHEN F2 =1 THEN 1 ELSE 0 END) AS Summe_F1_F2
            FROM [Tabelle]
            WHERE (F1 = 1 OR F2 = 1)
            GROUP BY ID

            Comment


            • #7
              allerdings ist F1 und F2 vom Typ Bit und das mag der SQL Server nicht addieren.
              Bestimmt nicht nur SQL-Server.

              Dafür gibt's CAST [HIGHLIGHT="SQL"]SELECT ID
              , SUM(CAST(F1 AS INT) + CAST(F2 AS INT) ) AS Summe_F1_F2
              FROM Tabelle
              WHERE F1 = 1 OR F2 = 1
              GROUP BY ID[/HIGHLIGHT]

              Comment


              • #8
                Oder den SQL Server einfach zu einem impliziten cast zwingen. Ist nicht besser liest sich aber einfacher Insbesondere wenn da noch ein paar dutzend bit Spalten dazukommen.
                [Highlight=SQL]
                SELECT ID
                , SUM(0 + F1 + F2) AS Summe_F1_F2
                FROM Tabelle
                WHERE F1 = 1 OR F2 = 1
                GROUP BY ID[/Highlight]

                Comment

                Working...
                X