Autor Beitrag
Chocoemilio
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 20.09.18 15:58 
Hallo

Ich habe folgendes Problem und zwar, werden immer zwei date übermittelt von - bis. Sagen wir mal zwischen drei Tagen.
Eine Person arbeitet an den Tagen an der packet_list station und ich möchte jetzt über den query herausfinden wieviele artikel er pro tag abgearbeitet hat, ich habe jetzt folgenden query:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
SELECT 
      `name`,
      (SELECT 
              COUNT(packet_list)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packet_list`
                  AND packetDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59'
        GROUP BY
          DATE(packetDate)) packet_list,
      (SELECT 
              COUNT(packing)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packing`
                  AND packingDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59'
                                  GROUP BY
          DATE(packing)) packing,
      
  FROM
      AzManager.Users u
          LEFT JOIN
      Otto.OttoTool_Control oc ON oc.packet_list = u.name
  WHERE
      (allow_fbatool_packing = 'Y'
          OR allow_fbatool_printing = 'Y'
          OR allow_fbatool_labeling = 'Y')
  GROUP BY u.name

Klar das immer pro subquery mehrere rows angezeigt werden und er meckert gerade deswegen (Subquery returns more than 1 row)

Was mache ich falsch ????

Danke schon mal :-)

Moderiert von user profile iconTh69: Code- durch SQL-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.09.18 17:36 
Zitat:
Klar das immer pro subquery mehrere rows angezeigt werden und er mekert gerade deswegen (Subquery returns more than 1 row)

Was mache ich falsch ????

Wenn dir das doch klar ist, wie du sagst, solltest es dir doch klar sein :suspect:

Wen da mehrere Datensatze von den Subselects zurückkommen und das auch das ist was du willst dann kannst du die innerhalb der select Liste nicht benutzen. Das Ergebnis des Subselects muss ein Skalar sein, also genau 1 Wert. Vermutlich solltest du die beiden Subselects per (outer) join hinzufügen. Um zu helfen wie genau müsste man aber das gewünschte Ergebnis erst mal verstehen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 20.09.18 17:43 
Wenn du nur die Anzahl der Datensätze haben möchtest, dann probiere mal als jeweilige Sub-Query:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
(SELECT COUNT(*) FROM
         (SELECT *
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packet_list`
              AND packetDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59'
          GROUP BY
              DATE(packetDate))) packet_list

(analog für packing)
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 21.09.18 09:27 
Hi

Danke für die Antwort.
Leider meckert er das er den u.name nicht kennt ???
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
SELECT 
      `name`,
    (SELECT COUNT(*) FROM
         (SELECT *
          FROM
              Otto.OttoTool_Control oc
          WHERE
              Users.`name` = oc.`packet_list`
              AND packetDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59'
          GROUP BY
              DATE(packetDate)) packet_list) packet_list,
      (SELECT 
              COUNT(packing)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packing`
                  AND packingDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59') packing,
      
  FROM
      AzManager.Users u
          LEFT JOIN
      Otto.OttoTool_Control oc ON oc.packet_list = u.name
  WHERE
      (allow_fbatool_packing = 'Y'
          OR allow_fbatool_printing = 'Y'
          OR allow_fbatool_labeling = 'Y')
  GROUP BY u.name

Leider weiß ich nicht warum er auf einmal das AzManager.Users u nicht erkennt ???

Moderiert von user profile iconTh69: Code- durch SQL-Tags ersetzt
Moderiert von user profile iconTh69: SQL-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 21.09.18 13:15 
Kannst du denn die Query nicht ersteinmal auf das Wesentliche reduzieren? Und wenn diese dann funktioniert, dann nach und nach die weiteren Elemente (Bedingungen, Sub-Queries, ...) hinzufügen?

Welches u.name meinst du denn? Dort wo du jetzt Users.`name` hingeschrieben hast?

Außerdem ist es nicht sinnvoll in den Sub-Queries gleiche Namen wie in der Hauptquery zu verwenden (z.B. oc).
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 21.09.18 14:35 
Hi

Also so wie ich das query erstellt habe funktioniert es perfekt:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
SELECT 
      `name`,
      (SELECT 
              COUNT(packet_list)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packet_list`
                  AND packetDate BETWEEN date_from AND date_to) packet_list,
      (SELECT 
              COUNT(packing)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packing`
                  AND packingDate BETWEEN date_from AND date_to) packing,
      
  FROM
      AzManager.Users u
          LEFT JOIN
      Otto.OttoTool_Control oc ON oc.packet_list = u.name
  WHERE
      (allow_fbatool_packing = 'Y'
          OR allow_fbatool_printing = 'Y'
          OR allow_fbatool_labeling = 'Y')
  GROUP BY u.name
  ORDER BY u.`name`;

und jetzt wollte ich die halt erweitern so das nicht alle Tage zusammen gezählt werden (also vonDatum bisDatum 200 packet_list),
sondern eine Zählung pro Tag erfolgt und ausgegeben wird:
ausblenden Quelltext
1:
2:
3:
        '2018-09-18 00:00:00'   '2018-09-19 00:00:00'  '2018-09-20 00:00:00'   
Lutz           50                        100                    50
Dieter         10                        200                    20


Das wäre halt der nächste schritt aber ich komme da halt nicht weiter ?

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
SELECT 
      `name`,
    (SELECT COUNT(*) FROM
         (SELECT *
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packet_list`
              AND packetDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59'
          GROUP BY
              DATE(packetDate)) packet_list) packet_list,
      (SELECT 
              COUNT(packing)
          FROM
              Otto.OttoTool_Control oc
          WHERE
              u.`name` = oc.`packing`
                  AND packingDate BETWEEN '2018-09-18 00:00:00' AND '2018-09-20 23:59:59') packing,
      
  FROM
      AzManager.Users u
          LEFT JOIN
      Otto.OttoTool_Control oc ON oc.packet_list = u.name
  WHERE
      (allow_fbatool_packing = 'Y'
          OR allow_fbatool_printing = 'Y'
          OR allow_fbatool_labeling = 'Y')
  GROUP BY u.name


Ja das u.name genau dort, er erkennt das nicht mehr ?

Ich hoffe das hat etwas geholfen.

Moderiert von user profile iconTh69: Code- durch SQL-Tags ersetzt
Moderiert von user profile iconTh69: SQL-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 21.09.18 15:39 
Da scheint er wohl die Variable innerhalb von Sub-Sub-Queries nicht mehr zuordnen zu können.

Welche DB verwendest du denn?
Könntest du evtl. eine Prozedur für die Sub-Queries schreiben, welche den Namen als Parameter erhält?
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 21.09.18 16:00 
Ich wollte eh eine Prozedur erstellen welche das Datum als Parameter übergibt, mit den Namen wir es wohl nicht gehen. Ich weiß ja nicht wer an den Tagen gearbeitet hat und es können ja auch mehrere Arbeiter sein.

Ich arbeite mit der Mysql Workbench.
Chocoemilio Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 25.09.18 08:14 
Schade :-((((
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.09.18 08:54 
Hast du denn schon mal die von Ralf angesprochenen (Outer) Joins probiert?

Ich hoffe dir ist klar, daß du mittels Sub-Queries niemals eine dynamische Tabelle (mit beliebigen Spalten) erzeugen kannst?!
Die (erwartete) Ausgabe wird also so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Lutz       '2018-09-18 00:00:00'     50
Lutz       '2018-09-19 00:00:00'    100
Lutz       '2018-09-20 00:00:00'     50
Dieter     '2018-09-18 00:00:00'     10
Dieter     '2018-09-19 00:00:00'    200
Dieter     '2018-09-20 00:00:00'     20


PS: Es gibt doch einen Weg dynamische Tabellen zu erzeugen, jedoch benötigt man dazu eine sog. Pivot-Tabelle: MySQL dynamic column name (das Beispiel ist sogar deinem ganz ähnlich, da es auch die einzelnen Tage als Spalten anzeigt)

PPS: Mein Ansatz bezog sich ersteinmal nur darauf die Fehlermeldung bzgl. "more than 1 row" zu eliminieren, aber das scheint ja so auch nicht zu funktionieren.