Gibt es eine Möglichkeit, ein berechnetes Feld in einer MySQL-Anweisung wiederzuverwenden? Ich erhalte die Fehlermeldung "unbekannte Spalte total_sale" für:
SELECT
s.f1 + s.f2 as total_sale,
s.f1 / total_sale as f1_percent
FROM sales s
oder muss ich die Berechnung wiederholen, was zu einer sehr langen SQL-Anweisung führen würde, wenn ich alle erforderlichen Berechnungen hinzufügen würde.
SELECT
s.f1 + s.f2 as total_sale,
s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s
Natürlich kann ich alle Berechnungen in meinem PHP-Programm durchführen.
mysql
sql
mysql-error-1054
sdfor
quelle
quelle
Antworten:
Ja, Sie können Variablen wiederverwenden. Das ist wie man es macht:
SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s
Lesen Sie hier mehr darüber: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
[Hinweis: Dieses Verhalten ist undefiniert. Laut den MySQL-Dokumenten:]
quelle
SET
Anweisung oder einer abgeleiteten Tabellen- / Inline-Ansicht.SUM
oderCOUNT
, erhalte ich das kontraintuitive und nicht hilfreiche Ergebnis, dass die Variablen immer den Wert der vorherigen Zeile haben, nicht die Zeile, in der ich mich befinde. Sie wird aus gutem Grund nicht unterstützt und sollte es auch sein vermieden.Folgendes scheint bei meinen Tests unter MySQL 5.5 gut zu funktionieren:
SELECT s.f1 + s.f2 as total_sale, s.f1 / (SELECT total_sale) as f1_percent FROM sales s
quelle
SUM
oderCOUNT
: Sie erhaltenreference '[colname]' not supported (reference to group function)
Nur plattformübergreifend unterstützte Mittel verwenden eine abgeleitete Tabellen- / Inline-Ansicht:
SELECT x.total_sale, x.f1 / x.total_sale as f1_percent FROM (SELECT s.f1, s.f1 + s.f2 as total_sale, FROM sales s) x
quelle
Sie können eine Unterauswahl verwenden:
select tbl1.total_sale, tbl1.f1/tbl1.total_sale as f1_percent from (select s.f1+s.f2 AS total_sale, s.f1 from sales s) as tbl1;
quelle
Sie können Unterabfragen wie folgt verwenden:
SELECT h.total_sale, s.f1 / h.total_sale AS f1_percent FROM sales s, (SELECT id, f1 + f2 AS total_sale FROM sales) h WHERE s.id = h.id
Bearbeiten:
festes kartesisches Produkt, vorausgesetzt der Primärschlüssel ist
id
.Dies sollte nach der Optimierung der Lösung von OMG Ponies entsprechen, aber ich denke, es wird schwieriger zu lesen, wenn Sie mehr Unterabfragen benötigen.
quelle
Ich habe mir hier verschiedene Antworten angesehen und ein paar Experimente durchgeführt.
Insbesondere verwende ich MariaDB 10.1.
Für eine "einfache" Sache können Sie tun, was Robert D in seinem Kommentar vorgeschlagen hat:
SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items
Wenn Sie eine Art Aggregatfunktion mit einem inneren Join verwenden, können Sie diese nicht verwenden. Sie können diesen Ansatz jedoch wie folgt mit dem inneren Join-Ansatz kombinieren (NB MwSt. = "Umsatzsteuer" ... und NB in Finanzdatenwährung) Felder haben normalerweise 4 Dezimalstellen, ich denke es ist historisch ...)
SELECT invoices.invoiceNo, invoices.clientID, invoices.Date, invoices.Paid, invoicesWithSubtotal.Subtotal, ROUND( CAST( Subtotal * invoices.VATRate AS DECIMAL( 10, 4 )), 2 ) AS VAT, (SELECT VAT + Subtotal) AS Total FROM invoices INNER JOIN ( SELECT Sum( invoiceitems.Charge ) AS Subtotal, invoices.InvoiceNo FROM invoices INNER JOIN invoiceitems ON invoices.InvoiceNo = invoiceitems.InvoiceNo GROUP BY invoices.InvoiceNo ) invoicesWithSubtotal ON invoices.InvoiceNo = invoicesWithSubtotal.InvoiceNo
Ich wollte das oben
View
Gesagte verwenden, um Rechnungen mit ihren Zwischensummen, Mehrwertsteuer und Summen aufzulisten. Es stellte sich heraus, dass MariaDB (und mit ziemlicher Sicherheit MySQL) das Verschachteln in derFROM
Klausel nicht zulassen . Dies lässt sich jedoch leicht lösen, indem Sie eine ersteView
erstellen, die dasInvoiceNo
und auflistetSubtotal
, und dann eine zweiteView
erstellen, die auf die erste verweist. In Bezug auf die Leistung habe ich überhaupt keine Ahnung von dieser Art von DoppelanordnungView
.quelle
Ich habe Folgendes getestet und es scheint die ganze Zeit zu funktionieren. Vielleicht gibt es einen Grund dafür, weil ich die Variable @total_sales als Wert und nicht als Zeichenfolge vordefiniert und ihren Typ während der Auswahl nicht neu definiert habe Erklärung ??
Wenn ich folgendes mache
set @total_sales = 0; SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s
quelle