Announcement

Collapse
No announcement yet.

View zum Zählen von Vorkommnissen

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

  • View zum Zählen von Vorkommnissen

    Moin allerseits.

    Ich arbeite mit einer Datenbank basierten FM- Anwendung, die Tabellen sind in einer MS-SQL Server 2008- Datenbank organisiert. Kleine Vorgeschichte. Es geht um eine Raumverwaltung. In der Datenbank gibt es Räume, die versorgt werden (thermisch, elektrisch, Zuluft ... usw.). Nun sind für diesen View drei Tabellen wichtig (Siehe Bild): "Room", "VT_EL_Erzeuger" und "HT_Baugruppe_Raum". In letzterer ist die Verknüpfung "Baugruppe versorgt Raum" zu finden. Jetzt möchte ich in dem View "VW_Number_of_Erzeuger_EL" für jede Room.ID die (Anzahl) Zeilen aus der "HT_Baugruppe_Raum"-Tabelle zählen, für die die Erzeuger auch wirklich in "VT_EL_Erzeuger" zu finden sind, da später auch andere Erzeuger diesen Raum versorgen werden, aber in einem anderen View gezählt werden sollen, der dann analog zu diesem hier aufgebaut wird. Es soll also in einer Tabelle zusammengefasst werden, die Room.ID und die Anzahl der Elektrischen Erzeuger, die diesen Raum versorgen.

    Ich habe schon einmal angefangen, aber ich denke, dass das noch nicht korrekt ist (die Stelle mit dem count (*) scheint mir falsch):

    Code:
    CREATE VIEW [VW_Number_of_Erzeuger_EL] AS
    (SELECT dbo.Room.ID, count(*) from dbo.HT_Baugruppe_Raum AS Anzahl_Erzeuger
    FROM dbo.Room INNER JOIN 
               dbo.HT_Baugruppe_Raum ON dbo.Room.ID = dbo.HT_Baugruppe_Raum.ref_room INNER JOIN
               dbo.VT_EL_Erzeuger ON dbo.VT_EL_Erzeuger.ID = dbo.HT_Baugruppe_Raum.ref_Baugruppe1
    GROUP BY dbo.Room.ID)
    GO
    Ich danke schonmal für die Hilfe

    Mit freundlichen Grüßen
    crush1985
    Attached Files

  • #2
    Hi,

    als erstes mal ne Frage.

    Warum nimmst du count(*)? Für die Performanc der Abfrage wäre es besser wenn du count(dbo.room.id) nehmen würdest.

    Im Rest habe ich jetzt aktuell keinen Fehler gesehen.

    Gruss

    Michael
    http://www.mschnuerer.de

    Comment


    • #3
      Performancemäßig dürfte das ziemlich egal sein, aber während ein count(*) die Anzahl aller Datensätze des selects liefert, würde ein count(dbo.room.id) nur die Anzahl der Sätze liefern, bei denen dbo.room.id NICHT NULL ist - das wird in diesem Fall wahrscheinlich keinen Unterschied machen, ist aber in einem anderen Fall vielleicht essentiell zu wissen!

      bye,
      Helmut

      PS: bei COUNT gäbe es zB auch noch ein COUNT(DISTINCT dbo.room.id)...

      Comment


      • #4
        Ich habe schon einmal angefangen, aber ich denke, dass das noch nicht korrekt ist
        Erscheint es dir nur so oder erhältst du tatsächlich ein überprüfbar falsches Ergebnis? Prinzipiell sieht das richtig aus. Ich halte nur die Room Tabelle hier für überflüssig. Du kannst genauso gut über HT_Baugruppe_Raum.ref_room gruppieren und die Room Tabelle raus werfen.


        Edit: Kann es sein das du nur die Anzahl eindeutiger ref_Baugruppe1 Werte je ref_room in der HT_Baugruppe_Raum Tabelle willst? Also einfach nur

        [Highlight=SQL]SELECT ref_room AS ID, count(Distinct ref_Baugruppe1) AS Anzahl_Erzeuger
        FROM HT_Baugruppe_Raum
        GROUP BY ref_room[/Highlight]
        Zuletzt editiert von Ralf Jansen; 20.10.2011, 14:25.

        Comment


        • #5
          Moin, danke schonmal für die Antworten. Es geht nicht, einfach nur die Erzeuger für einen Raum zu zählen, da in der Tabelle HT_Baugruppe_Raum auch andere Erzeuger (thermisch, zuluft, abluft etc.) zu finden sind, die einen Raum versorgen können. Und ich möchte in diesem View nur die Erzeuger pro Raum haben, die elektrisch sind. Also würde der Code von Ralf Jansen reicht dafür nicht.

          Ich werde mal die Abfrage im SQL-Server starten und gucken was raukommt.

          Und ja, bei näherer Betrachtung kann man "Room" weglassen, da ja alle Werte von "ref_room" in "Room" vorkommen und es keinen Sinn macht, da noch einen JOIN zu machen.
          Code:
          SELECT ref_room AS ID, count(DISTINCT ref_Baugruppe1) AS Anzahl_Erzeuger
          FROM HT_Baugruppe_Raum INNER JOIN 
                     dbo.VT_EL_Erzeuger ON dbo.VT_EL_Erzeuger.ID = dbo.HT_Baugruppe_Raum.ref_Baugruppe1
          GROUP BY ref_room
          GO

          EDIT: Also wie es aussieht, funktioniert die Abfrage, so wie sie oben steht. Habe Elektrische Erzeuger zu einem Raum hinzugefügt, Anzahl erhöht sich, nach Entfernen verringert sich die Anzahl, und bei Hinzufügen von anderen Baugruppen, die nicht Elektrische Erzeuger sind, passiert nichts mit der Anzahl.

          Mit freundlichen Grüßen

          crush1985
          Zuletzt editiert von crush1985; 21.10.2011, 07:22.

          Comment


          • #6
            Moin, ich bin es noch einmal. Also der Aktuelle Code der Abfrage ist immernoch:

            Code:
            SELECT     dbo.HT_Baugruppe_Raum.ref_room AS ID, COUNT(DISTINCT dbo.HT_Baugruppe_Raum.ref_Baugruppe1) AS Anzahl_Erzeuger_EL
            FROM         dbo.HT_Baugruppe_Raum INNER JOIN
                                  dbo.VT_EL_Erzeuger ON dbo.HT_Baugruppe_Raum.ref_Baugruppe1 = dbo.VT_EL_Erzeuger.ID
            GROUP BY dbo.HT_Baugruppe_Raum.ref_room
            Und er funktioniert auch wunderbar.

            Nun möchte ich aber noch ein weiteres Attribut mit dem View erzeugen. Und zwar soll ein logischer Wert ( 0 oder 1) erzeugt werden, der nachher in einer Eingabemaske als CheckBox verwendet werden soll. Diese soll nämlich angehakt sein, sobald die Anzahl der Erzeuger größer 0 ist. Ich habe gedacht, dass in der Select-Abfrage auch ein CASE WHEN THEN ELSE END vorkommen kann? Aber ich bekommen nichts sinnvolles auf die Reihe. Muss dieses Objekt schon in irgendeiner der am View beteiligten Tabellen vorhanden sein, oder kann man dieses in diesem View direkt erzeugen?

            Am Ende soll in einer Eingabemaske die Anzahl der Erzeuger stehen (funktioniert bereits), die Checkbox angehakt werden, sobald die Anzahl größer 0 ist. Dafür brauche ich nur ein Attribut mit 0 oder 1.

            Comment


            • #7
              Hi,

              versuch dich hier mal durch zuschlagen.

              Mit dem Case liegst du in meinen Augen schon richtig.

              Gruss

              Michael
              http://www.mschnuerer.de

              Comment


              • #8
                Also würde ich so denken:

                Code:
                SELECT     dbo.HT_Baugruppe_Raum.ref_room AS ID, COUNT(DISTINCT dbo.HT_Baugruppe_Raum.ref_Baugruppe1) 
                AS Anzahl_Erzeuger_EL, IC_el_versorgt = 
                CASE Anzahl_Erzeuger_EL
                WHEN > 0 THEN 1
                ELSE 0
                END
                FROM dbo.HT_Baugruppe_Raum INNER JOIN
                dbo.VT_EL_Erzeuger ON dbo.HT_Baugruppe_Raum.ref_Baugruppe1 = dbo.VT_EL_Erzeuger.ID
                GROUP BY dbo.HT_Baugruppe_Raum.ref_room
                Oder kann ich keinen CASE mit der gerade erzeugte Spalte "Anzahl_Erzeuger_EL" machen?

                EDIT: Gerade getestet, geht so nicht, müsste statt "Anzahl_Erzeuger_EL" nur "COUNT(DISTINCT dbo.HT_Baugruppe_Raum.ref_Baugruppe1)" wieder eintragen, aber dabei fällt mir auf, dass da kein CASE notwendig ist. Denn wenn der VIEW eine Zeile hinzufügen kann, ist ja automatisch ein elektrischer Erzeuger vorhanden. Also scheint auch zu reichen:
                Code:
                SELECT     dbo.HT_Baugruppe_Raum.ref_room AS ID, COUNT(DISTINCT dbo.HT_Baugruppe_Raum.ref_Baugruppe1) 
                AS Anzahl_Erzeuger_EL, 1 AS IC_el_versorgt
                FROM dbo.HT_Baugruppe_Raum INNER JOIN
                dbo.VT_EL_Erzeuger ON dbo.HT_Baugruppe_Raum.ref_Baugruppe1 = dbo.VT_EL_Erzeuger.ID
                GROUP BY dbo.HT_Baugruppe_Raum.ref_room
                Zuletzt editiert von crush1985; 31.10.2011, 08:11.

                Comment

                Working...
                X