Announcement

Collapse
No announcement yet.

Verflixte SQL Abfragen

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

  • Verflixte SQL Abfragen

    Hallo Liebe Gemeinde, ich bin neu hier im Forum und muss sagen ich habe mit SQL bis jetzt nicht al zu viel Erfahrung gemacht. Das meiste was ich bis jetzt mit SQL gemacht habe, waren Query's die ich direkt über eine C# Programm gesendet/abgefragt habe und dann die Daten direkt über die Anwendung verarbeitet/ausgewertet. Jetzt brauche ich aber eine Abfrage die über eine Externe Schnittstelle einer anderen Anwendung verarbeitet wird und mir dann die Daten zurück liefert. Hier komme ich aber nicht weiter.

    in der Tabelle sind unter anderem Folgende Felder Datumvon, Datumbis, Konto, PersonNummer, Wert

    Beispiel:
    DATVON Datumbis Konto PNR Netto
    2019-03-10 00:00:000 2019-03-13 00:00:000 11 14 1
    2019-03-11 00:00:000 2019-03-13 00:00:000 11 14 3
    2019-03-09 00:00:000 2019-03-09 00:00:000 13 14 1


    Ich möchte jetzt eine SQL Anweisung zusammen bauen die mir dann doppelte Einträge zu einer PersonNummer und gleichen Konto summiert welche innerhalb eines Datum Bereiches liegen.

    Mit dieser Anweisung bekomme ich zwar die DAten aber nicht die Felder Summiert,

    SELECT PZSTAMM.PNR,
    case when DATEPART(YEAR, Q1.DATVON) is not null then DATEPART(YEAR, Q1.DATVON) else DATEPART(YEAR, Q2.DATVON) end as ABRJAHR,
    case when DATEPART(MONTH, Q1.DATVON) is not null then DATEPART(MONTH, Q1.DATVON) else DATEPART(MONTH, Q2.DATVON) end as ABRMONAT,
    case when Q1.KTONR is not null then Q1.KTONR else Q2.KTONR end as Konto,
    INTNR,
    case when sum(Q1.NETTO) is not null then sum(Q1.NETTO) else 0 end as UTAGE,
    case when sum(Q2.NETTO) is not null then sum(Q2.NETTO) else 0 end as KTAGE
    from PZSTAMM
    left outer join PZFEZEIT as Q1 on Q1.PNR = PZSTAMM.PNR and Q1.KTONR = 13 and Q1.DATVON BETWEEN DateAdd(m, -1, '15.03.2019') AND CONVERT(datetime, '15.03.2019', 104)
    left outer join PZFEZEIT as Q2 on Q2.PNR = PZSTAMM.PNR and Q2.KTONR = 11 and Q2.DATVON BETWEEN DateAdd(m, -1, '15.03.2019') AND CONVERT(datetime, '15.03.2019', 104)
    where (PZSTAMM.ZE=1) and PZSTAMM.PNR in (select PNR from PZFEZEIT where DATVON BETWEEN DateAdd(m, -1, '15.03.2019') AND CONVERT(datetime, '15.03.2019', 104) and KTONR in (13,11))
    GROUP By PZSTAMM.PNR, Q1.DATVON, Q2.DATVON, INTNR, Q1.KTONR, Q2.KTONR

    Nachtrag:
    Das Ergebnis was ich benötige oder wie es aussehen sollte:

    Felder ABJAHR, ABRMONAT, UTAGE, KTAGE,
    Daten: 2019, 3, 4, 1

    also zu einem Datumbereich von/bis alle Wert-Daten zu dem jeweiligen Konto zusammen addieren.


    UTAGE wäre Konto 11 (Wert = 4)
    2019-03-10 00:00:000 2019-03-13 00:00:000 11 14 1
    2019-03-11 00:00:000 2019-03-13 00:00:000 11 14 3

    KTAGE wäre Konto 13
    2019-03-09 00:00:000 2019-03-09 00:00:000 13 14 1

    Geht das überhaupt über ein SQL Script? Wenn ja wo ist mein Denkfehler.

    Vielen Dank und Grüße
    Zuletzt editiert von RStorm; 14.03.2019, 11:13.

  • #2
    select sum(wert),Konto, Personummer from tabelle where Datvon>=.... and Datbis <= ...group by Konto, Personummer;
    Christian

    Comment


    • #3
      Danke aber das ist glaube nicht das richtige, habe auch gesehen das ich was vergessen hatte, wie das ganze aus sehen sollte.

      Habe es mal ergänzt.

      Comment


      • #4
        Originally posted by RStorm View Post
        --

        Felder ABJAHR, ABRMONAT, UTAGE, KTAGE,
        Daten: 2019, 3, 4, 1
        --
        das ich was vergessen hatte, wie das ganze aus sehen sollte.

        Habe es mal ergänzt.
        Gut, das Wunschergebnis ist natürlich sehr sprechend, sehr gute Maßnahme, wieso nicht gleich?!
        Ist es das im Zitat die Änderung?

        1. Das Statement von Christian ist richtig, es berücksichtigt nur nicht die Spalten, die Du haben willst, es ist ein Beispiel wie es geht.
        2. Du machst keinen Denkfehler, Du wendest die Group By Regeln nicht an
        3. Du zeigst ein Wunschergebnis, das der Befürchtung Anlass gibt, Du hast auch Time Anteile in Deinen Werten
        4. Das große Statenebt "das nicht summiert" enthält die Personalnummer in der Ausgabe, die ist in Deinem Wunschergebnis nicht enthalten.
        5. Aus 3 folgt, eine Gruppierung wird sehr kleinteilig bei vorhandenen Zeitwerten.
        6. Aus 4 folgt etwas ähnliches, ein ausgegebener Detailwert verhindert die Gruppierung.

        Also kläre die Time Anteilfrage und schneide das ggF. ab.
        Nimm die gewünschten Ausgabespalten und gruppiere sie, außer es ist eine aggregierte Ausgabe.


        Comment


        • #5
          Hallo defo2,

          danke für deine Antwort,

          Ja ab "Nachtrag" im ersten Post ist das was ich vergessen hatte.

          Was genau meinst du mit "Group By" - Regel, ich dachte ich habe die mit drin, gibt es da etwas zu beachten? Sorry wie gesagt ich bin in diesen Thema mit SQL nicht tief drin.
          Falls du mit Time Anteil einen Zeitlichen Bereich in dem DATVON Feld meinst dann nein, es steht immer auf 00:00:000, darin ist nur das Datum relevant. Hier sollen nur Bereiche z.B. vom 15.2.2019 - 15.3.2019 ausgewählt werden.

          Wie gesagt die Abfrage die ich zusammen gebaut habe funktioniert eigentlich, führe ich sie aus bekomme ich so etwas zurück, das kommt über die Externe Schnittstelle und wird von der Kunden Software als txt-Datei gespeichert.

          Der Relevante Teil ist nach dem Datum
          20;323;01/02/2019;0,0;7,0
          20;39;01/02/2019;0,0;7,0
          20;405;01/02/2019;1,0;1,0 - Diese 2 Blauen Felder sollten als eine zusammen gefasst werden und dann sollte nur
          20;405;01/02/2019;4,0;1,0 - 20;405;01/02/2019;5,0;1,0 stehen,
          20;26;01/03/2019;0,0;3,0

          also würde ich es mit C# machen würde ich mir erst alle Daten von der PNR-Nummer in dem Zeitraum von - bis für das Konto 11 abfragen danach das gleich für das Konto 13 und mir den String selber zusammen bauen. Oder der Performance halber alle benötigten Daten direkt zu holen und dann alles zusammen Parsen. Da ich es hier mit c# nichts machen kann, suche ich eine Möglichkeit das über SQL zu erledigen, so das er mir quasi über die Abfrage die jeweiligen Felder zu einer Bedingung zusammen addiert und dann als Ausgibt.

          Ich verstehe auch nicht was aggregierter Ausgabe sein sein.

          Ok glaube dann sollte ich mich mal in die Group By regeln einlesen.

          Comment


          • #6
            Deine Angaben stimmen hier hinten und vorne nicht
            Das was du jetzt als Ergebnis zeigst, ist anders als das im ersten Post.
            Auch die Frage ist anders.
            Erst heißt es, das etwas summiert werden soll, nun sollen Spalten addiert werden.

            Spalten kann man addieren mit

            ....,(Spalte1 + Spalte2) as Ergebnis.,,,,

            Beide Spalten werden zusammengefasst und unter dem Alias Ergebnis verfügbar gemacht.
            Dann muss auch über dieses Konstrukt gruppiert werden




            Christian

            Comment

            Working...
            X