Sie wollen „zählt“ von Aufträgen, die bestimmte Bedingungen über mehrere Zeilen entsprechen, so würde ich mit einer GROUP BY order_id
SELECT ...
FROM mytable t
GROUP BY t.order_id
Um herauszufinden, starten, wenn eine bestimmte Reihenfolge je eine hatte fehlgeschlagene Transaktionen usw. Wir können Aggregate für Ausdrücke verwenden, die Bedingungen "testen".
Zum Beispiel:
SELECT MAX(t.success=1) AS succeeded
, MAX(t.success=0) AS failed
, IF(MAX(t.success=1),0,1) AS never_succeeded
FROM mytable t
GROUP BY t.order_id
Die Ausdrücke in der SELECT-Liste der Abfrage ist MySQL Stenografie. Wir könnten längere Ausdrücke (MySQL IF() - Funktion oder ANSI-CASE-Ausdrücke) verwenden, um ein äquivalentes Ergebnis, z.
Wir könnten die Spalte `order_id` in die SELECT-Liste zum Testen aufnehmen. Wir können die Ergebnisse für jede order_id mit den Zeilen in der ursprünglichen Tabelle vergleichen, um zu überprüfen, ob die zurückgegebenen Ergebnisse die Spezifikation erfüllen.
Um "Anzahl" von Aufträgen zu erhalten, können wir die Abfrage als Inline-Ansicht referenzieren und Aggregatausdrücke in der SELECT-Liste verwenden.
Zum Beispiel:
SELECT SUM(r.succeeded) AS cnt_succeeded
, SUM(r.failed) AS cnt_failed
, SUM(r.never_succeeded) AS cnt_never_succeeded
FROM (
SELECT MAX(t.success=1) AS succeeded
, MAX(t.success=0) AS failed
, IF(MAX(t.success=1),0,1) AS never_succeeded
FROM mytable t
GROUP BY t.order_id
) r
Da die Ausdrücke in der SELECT-Liste Rückkehr entweder 0, 1 oder NULL, können wir die SUM() Aggregat verwenden, um eine Zählung zu bekommen. Um ein COUNT() - Aggregat zu verwenden, müssten wir NULL anstelle eines 0 (FALSE) -Werts zurückgeben.
SELECT COUNT(IF(r.succeeded,1,NULL)) AS cnt_succeeded
, COUNT(IF(r.failed,1,NULL)) AS cnt_failed
, COUNT(IF(r.never_succeeded,1,NULL)) AS cnt_never_succeeded
FROM (
SELECT MAX(t.success=1) AS succeeded
, MAX(t.success=0) AS failed
, IF(MAX(t.success=1),0,1) AS never_succeeded
FROM mytable t
GROUP BY t.order_id
) r
Wenn Sie eine Zählung aller order_id wollen, fügen Sie ein COUNT (1) Ausdruck in der äußeren Abfrage. Wenn Sie Prozentsätze benötigen, tun die Teilung und mit 100 multipliziert,
Zum Beispiel
SELECT SUM(r.succeeded) AS cnt_succeeded
, SUM(r.failed) AS cnt_failed
, SUM(r.never_succeeded) AS cnt_never_succeeded
, SUM(1) AS cnt_all_orders
, SUM(r.failed)/SUM(1)*100.0 AS pct_with_a_failure
, SUM(r.succeeded)/SUM(1)*100.0 AS pct_succeeded
, SUM(r.never_succeeded)/SUM(1)*100.0 AS pct_never_succeeded
FROM (
SELECT MAX(t.success=1) AS succeeded
, MAX(t.success=0) AS failed
, IF(MAX(t.success=1),0,1) AS never_succeeded
FROM mytable t
GROUP BY t.order_id
) r
(Die Prozentsätze sind hier ein Vergleich zu der Anzahl der deutlichen order_id Werte, nicht als die Gesamtzahl der Zeilen in der Tabelle).
möchten Sie order_id mit diesen Bedingungen oder Anzahl der Aufträge? – splash58
Nur die Summe ist in Ordnung für diese Frage. (In der Zukunft möchte ich vielleicht die Aufträge überprüfen, die nie eine erfolgreiche Transaktion hatten.) – seth