AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [SQL] JOIN joint zu oft
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] JOIN joint zu oft

Ein Thema von Medium · begonnen am 14. Jan 2010 · letzter Beitrag vom 14. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

[SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 12:16
Datenbank: MySQL • Version: 4.1 • Zugriff über: Zeos
Aloah!

Ich breche mir grad einen mit einem SQL-Statement ab. Ich habe folgende 2 Tabellen:

rkohis (Rezeptkopf-Historie)
- V_Dat (Vorgabedatum)
- Rez_Nr (Rezept-Nummer)
- Charge (frei vergebene Chargennummer)
- Rez_Name (String, Klartextname des Rezeptes)
- Komment (beliebiger Kommentar)

rpohis (Rezeptpositions-Historie)
- V_Dat (Vorgabedatum)
- Komp_Nr (Komponentennummer; ein Rohstoff des Rezeptes)
- Charge (frei vergebene Chargennummer)
- Rez_Nr (Rezept-Nummer)
- Anteil_Ist (verwogene Menge)

Ich möchte nun eine Abfrage haben, die ausgibt wie viel (Summe von Anteil_Ist) von jeden Rezept jemals produziert wurde, und in viel vielen Chargen das geschah. Folgendes Statement hab ich bisher:
SQL-Code:
SELECT
  k.REZ_NAME AS Rezeptname,
  k.KOMMENT AS Kommentar,
  COUNT(p.CHARGE)*1.0 AS Anzahl_Chargen,
  ROUND(SUM(p.ANTEIL_IST))*1.0 AS Menge
FROM
  rpohis p JOIN rkohis k ON p.REZ_NR = k.REZ_NR AND p.V_Dat = k.V_Dat
GROUP BY
  k.REZ_NAME
ORDER BY
  k.REZ_NAME
Das Problem ist, dass wenn ein Rezept z.B. 4 einzelne Komponenten hat ich am Ende den vierfachen Wert für "Anzahl_Chargen" herausbekomme.
Gruppiere ich zusätzlich nach "Komp_Nr", stimmen die jeweiligen Mengen, aber für jede Komponente ist natürlich die volle Anzahl Chargen eingetragen, die ohne diese Gruppierung zusammenaddiert werden - das darf nicht.

Kopf raucht. Wie kann ich das erreichen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 12:47
Kennt Mysql
Code:
Count distinct
das sollte dann besser passen

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 12:55
Kennt es, hat aber ein fieses Problem: Es können mehrere Vorgaben mit gleicher Chargennummer (sie ist ja frei vergebbar - frag mich nicht warum) passieren, wovon dann immer nur eine gezählt wird. In meinen Testdaten sind solche Fälle, und dort bekomme ich dann zu wenig raus.

Wo es zuerst 56 war aber 14 sein sollte, sind es jetzt 11 - die Chargennummern 1, 2 und 3 sind doppelt vergeben -> 3 zu wenig
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 13:05
Vielleicht wäre in diesem besonderen Fall ein Subselect für die Summen geeigneter
Markus Kinzler
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 13:07
Genau die kennt MySQL 4.1 leider nicht meine ich
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 13:22
Oder ein Join auf einen View über die Summen oder eine derived table
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 13:46
rkohis (Rezeptkopf-Historie)
- V_Dat (Vorgabedatum)
- Rez_Nr (Rezept-Nummer)
- Charge (frei vergebene Chargennummer)
- Rez_Name (String, Klartextname des Rezeptes)
- Komment (beliebiger Kommentar)

rpohis (Rezeptpositions-Historie)
- V_Dat (Vorgabedatum)
- Komp_Nr (Komponentennummer; ein Rohstoff des Rezeptes)
- Charge (frei vergebene Chargennummer)
- Rez_Nr (Rezept-Nummer)
- Anteil_Ist (verwogene Menge)


Wenn ich das richtig verstanden habe sind die oben gefetteten Felder für die eindeutuge Identifizierung notwendig, dann sollten die auch in einem Join auftauchen.

Wenn Du dann Komp_NR/Anteil_ist Zählen Summieren willst, sollte das passen.
Wenn die Charge mehrfach vergeben wurde, dann fällt die als "Zähler" einfach aus.

Wie verhält sich denn die Charge zur Rez_Nr ?
Letztlich kannst Du nur das aus der DB heraus holen was irgendwann einmal da hinein gstopft wurde.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 14:26
Zitat von mkinzler:
Oder ein Join auf einen View über die Summen oder eine derived table
Uhlala, Neuland für den kleinen Medium . Müsst ich erstmal eine kleine Lern-Session für einlegen.

@p80286: Völlig richtig, die 3 Angaben bilden den Index. Übrigens: Die Chargennummer ist nicht eine frei vergebene, sondern ein Produktionsauftrag kann für N Chargen gestartet werden. Für jede Charge wird dann ein neuer Kopf+Positionen eingetragen, und die Chargennummer ist dann fortlaufend. Da das Vorgabedatum aber für jeden Chargenstart, nicht für den ersten tatsächlichen Auftragsstart eingetragen wird, ist das Feld für eine Eindeutigkeitsbeziehung eigentlich überflüssig.
Anfügen von "AND p.Charge = k.Charge" im JOIN bewirkt daher auch leider keine Änderung

Wenn ich irgendwie 2 Schritte machen könnte, wäre das ganze vergleichsweise einfach. Ein Subselect wäre z.B. genial, dann wär's ein Kinderspiel. Ich fürchte ich muss mich tatsächlich in Views einlesen. Wobei ich immernoch der Meinung bin, dass das eigentlich alles in einem Statement möglich sein müsste. So rein instinktiv


Edit
Ich bin ja schon ein Trottel. MySQL 4.1 kennt Subselects! Aber... leider sind die keine Lösung
Folgendes Statement bringt das richtige Ergebnis:
SQL-Code:
SELECT
  k.REZ_NAME AS REZ_NAME,
  k.KOMMENT AS TEXT,
  (SELECT COUNT(Rez_Name) FROM rkohis WHERE Rez_Nr = 1)*1.0 AS Anz,
  ROUND(SUM(p.ANTEIL_I))*1.0 AS Menge
FROM
  rpohis p JOIN rkohis k ON p.REZ_NR = k.REZ_NR AND p.V_Dat = k.V_Dat AND k.Charge = p.Charge
WHERE
  p.Rez_Nr = 1
GROUP BY
  k.REZ_NAME
ORDER BY
  k.REZ_NAME
Aber! Die WHERE-Clause im äusseren Statement ist nicht immer nur so simpel. Der Anwender kann wählen welche Rezepte alle genommen werden sollen, so dass es auch mal heissen kann: "WHERE p.Rez_Nr = 1 OR p.Rez_Nr = 8 OR p.Rez_Nr = 21 OR ... OR ..."
Das ist mit dem Subselect dann schon wieder nicht mehr so einfach vereinbar fürchte ich
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 14:37
Bei einer derived table wird eine Abfrage wie eine Tabelle verwendet

SQL-Code:
select
    ...
from
    tabelle1 a on (
        select <gruppierungsfeld>, sum( <feld>) ...
    from
        tabelle2
    group by
        <Gruppierungsfeld>
    ) b on b.<Gruppierungsfeld> = a.<pk>;
Markus Kinzler
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: [SQL] JOIN joint zu oft

  Alt 14. Jan 2010, 14:48
AHHHH! Genial!

SQL-Code:
SELECT
  Rez_Name,
  Text,
  Anz,
  SUM(Menge) AS Menge
FROM (
  SELECT
    k.REZ_NAME AS REZ_NAME,
    k.KOMMENT AS TEXT,
    COUNT(p.CHARGE)*1.0 AS Anz,
    ROUND(SUM(p.ANTEIL_I))*1.0 AS Menge
  FROM
    rpohis p JOIN rkohis k ON p.REZ_NR = k.REZ_NR AND p.V_Dat = k.V_Dat AND k.Charge = p.Charge
  WHERE
    p.Rez_Nr = 1
  GROUP BY
    k.REZ_NAME, p.Komp_Nr
  ORDER BY
    k.REZ_NAME) AS tmp
GROUP BY
  Rez_Name
Daaaaaas funktionieeeert! Ich danke euch ganz ganz kräftig!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz