php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 4,00 durchschnittlich.
  #1 (permalink)  
Alt 17-11-2009, 19:41
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard Summe aus Summe

Hallo Forum,

ich habe so eine Abfrage:

PHP-Code:
SELECT 
t1
.number SUM(t2.number) as return
FROM t1
LEFT JOIN t2
USING 
(fieldname)
GROUP BY fieldname
HAVING 
return>
Die geht auch wunderbar. Ich hätte allerdings gern mit einer Abfrage die Summe von return, also SUM(SUM()), das scheint aber nicht zu gehen. Ich bekomme jedenfalls immer eine Fehlermeldung, dass GROUP BY dann nicht stimmt. Da gibt es doch sicher ne Möglichkeit, oder? Danke Euch!

Schönen Abend, Martin

Geändert von DerEsWissenWill (17-11-2009 um 20:02 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 17-11-2009, 20:07
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

da du deine Tabellen nicht näher spezifiziert hast (Spaltennamen), kann man nicht genauer erahnen, was du konkret machen möchtest.

Eventuell hilft dir "group by ... with rollup" schon weiter?

Generell ist die Addition kommutativ, daher kannst du eine Summe gruppieren wie du willst, es kommt immer das gleiche raus.

Falls das nicht hilft, bitte nochmal genauer werden.

Gruß,

Amica
Mit Zitat antworten
  #3 (permalink)  
Alt 17-11-2009, 20:18
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard Tabelle

Oh, ich dachte das reicht. Die Tabelle sieht halt grob so aus:

Tabelle 1:
t1.id
t1.number

Tabelle 2:
t2.id
ts.number

Tabelle 2 kann mehrere Datensätze enthalten, die über id Tabelle 1 zugeordnet sind. Konkret will ich also wissen, wieviel t1.number - summe(t2.number) noch offen ist. Aber halt wieder in Summe, also Quasi Summe(t1.number - Summe(t2.number)). Ich habe das zwischenzeitig mit einem Subselect gelöst, dachte aber es gibt noch eine Lösung ohne:

PHP-Code:
SELECT SUM(tempfield) AS return
FROM
(
    
SELECT
    t1
.number SUM(t2.number) as tempfield
    FROM
    t1
    LEFT JOIN
    t2
    USING 
(id)
    
GROUP BY t1.id
) as subselect
Mit Zitat antworten
  #4 (permalink)  
Alt 18-11-2009, 00:01
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Ok, ist es richtig, dass es zu jedem Datensatz in t1 beliebig viele datensätze in t2 geben kann?
Mit Zitat antworten
  #5 (permalink)  
Alt 18-11-2009, 00:19
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hast du es schon mal so versucht?:
Code:
select sum(distinct t1.number) - sum(ifnull(t2.number, 0))
from t1
left join t2 using (id)
Mit Zitat antworten
  #6 (permalink)  
Alt 19-11-2009, 09:53
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Deine Annahme ist richtig. In Tabelle 2 stehen (eventuell) mehrere Datensätze zu Tabelle 1.

Dein SQL Statement funktioniert, bringt aber nicht den korrekten Wert, den ich brauche. Nur zur Sicherheit nochmal. Ich brauche das Feld aus Tabelle 1 - die Summe der dazugehörigen aus Tabelle 2. Und daraus zeilenweise die Gesamtsumme.

Im Moment gehe ich t1.number - SUM(t2.number) einfach mit while durch, ich hätte das aber natürlich lieber mit einer Abfrage.
Mit Zitat antworten
  #7 (permalink)  
Alt 19-11-2009, 10:47
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von DerEsWissenWill Beitrag anzeigen
bringt aber nicht den korrekten Wert, den ich brauche.
Woher weißt du das? Welcher Wert hätte rauskommen müssen und welcher Wert kam mit meiner Variante raus? Bist du sicher, dass du Null-Werte korrekt verrechnest, wenn es z. B. für einen Datensatz t1 mit number=20 gar keine Datensätze in t2 gibt, sollte doch trotzdem 20 rauskommen, weil nichts abgezogen wird, oder? Ich hab das berücksichtigt, du auch?
Mit Zitat antworten
  #8 (permalink)  
Alt 19-11-2009, 10:54
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Einfach weil ich rechnen kann ;-) UNd bereits ein lauffähiges System habe nur halt mit unschönen Selects, weil ich einfach alle records mit while durchgehe. Ergo muss mit dem neuen Select das gleiche rauskommen, was mit dem alten rauskomme. Tuts aber nicht. Und ist sogar eine heftige Abweichung.
Mit Zitat antworten
  #9 (permalink)  
Alt 19-11-2009, 10:59
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Du bist leider nicht auf die Null-Werte eingegangen. Es gibt doch in deiner DB mit Sicherheit (sonst würdest du ja keinen left Join brauchen) Rows in t1, zu denen es keine Row in t2 gibt, richtig?

Wenn du mit deiner Variante durchgehst, erhältst du also z. B.
Code:
t1.number - sum(t2.number)
= 20 - sum(null)
= 20 - null
= null
Was machst du mit diesem null-Wert, für den ja eigentlich 20 rauskommen müsste, oder nicht?

Wenn du deine while-Schleife mal so modifizierst
Code:
t1.number - sum(ifnull(t2.number, 0))
, was kommt dann dabei raus?
Mit Zitat antworten
  #10 (permalink)  
Alt 19-11-2009, 11:12
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich mache eni HAVING numbers>0, vielleicht ist das das was Dir fehlte. Allerdings muss ich dazusagen, dass bei mir niemals NULL stand, sondern immer 0. Warum kann ich Dir nicht sagen. Liegt das allein daran, dass es ein int field ist?
Mit Zitat antworten
  #11 (permalink)  
Alt 19-11-2009, 11:17
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Having hat damit genau gar nichts zu tun, weil es erst ganz zum Schluss filtert, wenn alles schon berechnet ist. Mir fehlt auch nichts, danke der Nachfrage und ich gebe es auch jetzt auf, dich höflichst darauf hinzuweisen, dass deine Variante falsch rechnet, weil ich auch rechnen kann und weiß, dass meine Abfrage richtig rechnet. Den Hinweis auf das Komutativgesetzt hatte ich schon gegeben.

Wenn du in meiner Abfrage das "Left Join" durch ein "Join" ersetzt, kommt vermutlich sogar dasselbe raus, wie bei dir, weil sie dann genau so falsch rechnen müsste, wie deine Variante.

Also viel Spaß und Tschüß.
Mit Zitat antworten
  #12 (permalink)  
Alt 19-11-2009, 11:50
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Schon klar, danke trotzdem für den Versuch der Hilfe. Es kommt trotzdem NICHT das Falsche raus. Kann schon selbst rechnen, hatte sogar mal erfolgreich Mathe Leistungskurs ;o)

Übrigens: mit IFNULL kommt exakt das gleiche raus... Wirst Du aber wahrscheinlich nicht glauben, richtig? Ist aber so...

OHNE USING kommt was anderes raus, aber das ist ja auch Quatsch..
Mit Zitat antworten
  #13 (permalink)  
Alt 19-11-2009, 11:52
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Noch mal ich: JOIN und LEFT JOIN macht keinen Unterschied! Hab ich auch gerade getestet...
Mit Zitat antworten
  #14 (permalink)  
Alt 19-11-2009, 11:53
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und noch mal ich: ich KRIEGE NIRGENDWO ein NULL, immer 0.
Mit Zitat antworten
  #15 (permalink)  
Alt 19-11-2009, 12:49
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo nochmal,

das lässt mir keine Ruhe. Hier mal mein Testsetting und das was dabei rauskam:

Code:
create table t1 (
	id int unsigned not null auto_increment primary key,
	number int not null
);

create table t2 (
	id int unsigned not null,
	number int not null,
	index (id),
	foreign key (id) references t1 (id)
);



insert into t1 (number) values
(15),
(18),
(21),
(24),
(27);

insert into t2 (id, number) values
(1, 2),
(1, 4),
(1, 6),  -- 2 + 4 + 6 = 12 (von 15, 3 fehlen)

(2, 8),
(2, 10), -- 8 + 10 = 18 (von 18, 0 fehlen)

(3, 12), -- 12 (von 21, 9 fehlen)

         -- keine für id 4, 24 fehlen

(5, 14); -- 14 (von 27, 13 fehlen)

         -- es fehlen 49 gesamt

		 
		 
select *
from t1
left join t2 using id;

-- +----+--------+--------+
-- | id | number | number |
-- +----+--------+--------+
-- |  1 |     15 |      2 |
-- |  1 |     15 |      4 |
-- |  1 |     15 |      6 |
-- |  2 |     18 |      8 |
-- |  2 |     18 |     10 |
-- |  3 |     21 |     12 |
-- |  4 |     24 |   NULL |
-- |  5 |     27 |     14 |
-- +----+--------+--------+



select
	*,
	sum(t2.number),
	t1.number - sum(t2.number)
from t1
left join t2 using (id)
group by t1.id;

-- +----+--------+--------+----------------+----------------------------+
-- | id | number | number | sum(t2.number) | t1.number - sum(t2.number) |
-- +----+--------+--------+----------------+----------------------------+
-- |  1 |     15 |      2 |             12 |                          3 |
-- |  2 |     18 |      8 |             18 |                          0 |
-- |  3 |     21 |     12 |             12 |                          9 |
-- |  4 |     24 |   NULL |           NULL |                       NULL |
-- |  5 |     27 |     14 |             14 |                         13 |
-- +----+--------+--------+----------------+----------------------------+

-- Mit while durchgehen und summieren: 3 + 0 + 9 + 13 = 25 (statt 49)


select
	*,
	sum(ifnull(t2.number, 0)),
	t1.number - sum(ifnull(t2.number, 0))
from t1
left join t2 using (id)
group by t1.id;

-- +----+--------+--------+---------------------------+---------------------------------------+
-- | id | number | number | sum(ifnull(t2.number, 0)) | t1.number - sum(ifnull(t2.number, 0)) |
-- +----+--------+--------+---------------------------+---------------------------------------+
-- |  1 |     15 |      2 |                        12 |                                     3 |
-- |  2 |     18 |      8 |                        18 |                                     0 |
-- |  3 |     21 |     12 |                        12 |                                     9 |
-- |  4 |     24 |   NULL |                         0 |                                    24 |
-- |  5 |     27 |     14 |                        14 |                                    13 |
-- +----+--------+--------+---------------------------+---------------------------------------+

-- Mit while durchgehen und summieren: 3 + 0 + 9 + 24 + 13 = 49 (korrekt)



select sum(distinct t1.number) - sum(ifnull(t2.number, 0))
from t1
left join t2 using(id);

-- +-----------------------------------------------------+
-- | sum(distinct t1.number) - sum(ifnull(t2.number, 0)) |
-- +-----------------------------------------------------+
-- |                                                  49 |
-- +-----------------------------------------------------+

-- korrektes Ergebnis
Kannst dich ja gerne dazu äußern, wo gegebenenfalls Unterschiede zu deinem System bestehen.

Vielleicht finden wir dann raus, warum meine Variante bei dir nicht zu funktionieren scheint.

Gruß,

Amica
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP - SQL - Summe ? starsk8er PHP Developer Forum 1 28-02-2006 19:15
Summe berechnen thea SQL / Datenbanken 4 09-08-2005 10:05
Summe errechnen Boldiman SQL / Datenbanken 1 15-03-2004 09:29
limit bei summe ? nomidi SQL / Datenbanken 2 11-01-2003 14:10
Summe bei Vote Wotan PHP Developer Forum 5 11-06-2002 10:13

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:58 Uhr.