2016-08-02 27 views
0

Ich habe eine Tabelle: (Herausgegeben mit x5)mySQL: Summe von einer anderen Gruppe-by

_date(2014-03-05;2014-04-05) 
_period(1,2,3,4,5,1,2,3,4,5,1,2; 1,2,3,4,5,1,2,3,4,5) 
_id(x1,x1,x1,x1,x1,x2,x2,x2,x2,x2,x3,x3;x4,x4,x4,x4,x4,x5,x5,x5,x5,x5) 
_reading(1,1,1,1,1,2,2,2,2,2,5,6;1,1,1,1,1,2,1,1,1,1) 
_reading2 (5,5,5,5,5,4,4,4,4,4,7,7;1,1,1,1,1,1,1,1,1,1) 

image of the table 1

ich brauche ein Ergebnis wie unter dem alle Daten eliminiert, die nicht existieren volle Periode 1 bis 5 für die _id, berechnet dann die Summe von _reading für einen Tag und die Summe der _reading2 für jede einzelne _id für einen Tag:

_date(2014-03-05;2014-04-05) 
sum_reading(15;11) 
sum_reading2 (9;2) 

image of the table2

+0

Ich verstehe das Tabellenformat nicht sehr gut. Ich habe auch Probleme zu sehen, wo die 9 von sum_reading2 herkommt. Ich denke, die 15 auf sum_Reading kommt von der Summe der 1en und 2en und nicht 5,6, weil 5,6 gleich 1,2 auf Periode ist, was ein partieller und daher nicht gewünschter ist. Dies ist jedoch kein Standard-Datenlayout. Ich habe es schon mal gesehen. Können wir die Daten in ein Tabellenformat mit Spaltenüberschriften und Zeilen stellen, die die tatsächlichen Daten und erwarteten Ergebnisse darstellen? – xQbert

+0

@xQbert, ich habe Bilder der Tabellen hinzugefügt, hoffe das hilft. 9 kommt aus dem Hinzufügen von 5 + 4 aus _reading2 als _reading2 hat den gleichen Wert für die _id für einen Tag, es wiederholt nur für jede _period, ich muss nur eine in die Berechnung nehmen. – Lina

+0

Aber lesen 1 hat 1 für alle Werte, aber wir summieren diese? Wenn ja, mein Punkt ist, dass wir tatsächlich das Lesen von 1 summieren, aber wir addieren DISTINCT-Werte im Lesen von 2 ... also vielleicht nur sum (Distinct reading2)? – xQbert

Antwort

0

Geprüft: SQL Fiddle

ich eine Unterabfrage verwenden, um die _IDs zu eliminieren, die nicht eine volle 5 Perioden haben. Ich benutze dann die Gruppierung nach Datum und _ID und Summe vs Summe distinct, um die Gesamtsumme vs summierende unterschiedliche Werte zu erhalten.

SELECT A._date, sum(_Reading) as _Reading, 
       sum(Distinct _Reading2) as _Reading2 
FROM table A 
INNER JOIN (SELECT _ID, _date 
      FROM table 
      GROUP BY _ID, _date 
      HAVING count(_Period) = 5) B 
on A._ID = B._ID 
and A._Date = B._Date 
GROUP BY A._Date 

Dies kann immer noch nicht Ihre Bedürfnisse erfüllen, weil Reihenfolge der Lesungen und eine Reduzierung tatsächlich wichtig sein kann beim Lesen 2; nicht nur summierend. Aber da mir die Anforderungen nicht klar sind, und das zum gewünschten Ergebnis passt, ist es das Beste, was ich für jetzt tun kann.

Update für X5 - Indem wir die Summe in einer bestimmten auf der inneren Ebene erhalten, können wir dann die Messwerte summieren, die das Problem möglicherweise beheben.

SELECT A._date, sum(_Reading) as _Reading, 
       sum(B.I_reading2) as _Reading2 
FROM table A 
INNER JOIN (SELECT _ID, _date, Sum(Distinct _Reading2) as I_Reading2 
      FROM table 
      GROUP BY _ID, _date 
      HAVING count(_Period) = 5) B 
on A._ID = B._ID 
and A._Date = B._Date 
GROUP BY A._Date 
+0

Vielen Dank, das löst einen Teil meines Problems. Wenn ich jedoch x5 als _id hinzufüge und 1 für das _reading2 im Ergebnis habe, bekomme ich 1 für die Summe von _reading2, während ich 2 bekommen sollte. Ich glaube, dass es wegen des distinct, ist es möglich, es durch den Vergleich von zu ersetzen die Art? http://sqlfiddle.com/#!9/1b5f6/1 – Lina

+0

Können Sie die verknüpfte Geige anpassen und neu verknüpfen, um das Problem zu zeigen, bin ich mir nicht sicher über das Datum, an dem Sie gerade sind, noch wo der x5 wird hinzugefügt und mit welchen Werten. – xQbert

+0

Ich habe gerade hinzugefügt: Einfügen in Foo-Werte ('2014-03-06', 1, 'x5', 1,1); Einfügen in Foo-Werte ('2014-03-06', 2, 'x5', 1,1); Einfügen in Foo-Werte ('2014-03-06', 3, 'x5', 2,1); Einfügen in Foo-Werte ('2014-03-06', 4, 'x5', 2,1); Einfügen in Foo-Werte ('2014-03-06', 5, 'x5', 1,1); sqlfiddle.com/#!9/1b5f6/1/0 – Lina