Posso riutilizzare un campo calcolato in una query SELECT?

C’è un modo per riutilizzare un campo calcolato all’interno di un’istruzione mysql. Ottengo l’errore “colonna sconosciuta total_sale” per:

SELECT s.f1 + s.f2 as total_sale, s.f1 / total_sale as f1_percent FROM sales s 

o devo ripetere il calcolo, che farebbe per una dichiarazione SQL molto lunga se ho aggiunto tutti i calcoli che mi servono.

 SELECT s.f1 + s.f2 as total_sale, s.f1 / (s.f1 + s.f2) as f1_percent FROM sales s 

ovviamente posso fare tutti i calcoli nel mio programma php.

Sì, puoi riutilizzare le variabili. Ecco come lo fai:

 SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s 

Leggi di più qui: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

[Nota: questo comportamento non è definito. Secondo i documenti MySQL:]

Come regola generale, non si dovrebbe mai assegnare un valore a una variabile utente e leggere il valore all’interno della stessa istruzione. Potresti ottenere i risultati che ti aspetti, ma questo non è garantito.

Quanto segue sembra funzionare bene nei miei test su MySQL 5.5:

 SELECT s.f1 + s.f2 as total_sale, s.f1 / (SELECT total_sale) as f1_percent FROM sales s 

Solo i mezzi supportati da più piattaforms utilizzano una tabella derivata / vista in linea:

 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 

Puoi usare una sotto-selezione:

 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; 

Puoi usare sottoquery, come questo:

 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 

Modificare:
prodotto cartesiano fisso, supponendo che la chiave primaria sia id .
Questo dovrebbe essere equivalente alla soluzione di OMG Ponies dopo l’ottimizzazione, ma penso che diventerà più difficile da leggere se hai bisogno di più subquery.

Ho provato quanto segue e sembra funzionare tutto il tempo, forse c’è una ragione per questo, è perché ho predefinito la variabile @total_sales come un valore non una stringa, e non ho ridefinito il suo tipo durante la selezione affermazione ??

Se faccio quanto segue

  set @total_sales = 0; SELECT @total_sale := s.f1 + s.f2 as total_sale, s.f1 / @total_sale as f1_percent FROM sales s 

Ho dato un’occhiata a varie risposte qui e ho fatto alcuni esperimenti.

In particolare sto usando MariaDB 10.1.

Per una cosa “semplice” puoi fare ciò che Robert D ha suggerito nel suo commento:

 SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items 

Se si utilizza una sorta di funzione di aggregazione con un join interno non è ansible utilizzarlo, ma è ansible combinare questo approccio con l’approccio inner join come segue (NB VAT = “IVA” … e NB nella valuta dei dati finanziari i campi hanno in genere 4 cifre decimali, penso sia storico …)

 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 

Volevo usare quanto sopra per creare una View per elencare le fatture con i loro subtotali, IVA e totali … si è scoperto che MariaDB (e quasi certamente MySQL) non consente il nesting nella clausola FROM . Tuttavia, questo è facilmente risolvibile facendo una prima View che elenca il valore InvoiceNo e Subtotal , e quindi facendo una seconda View che fa riferimento al primo. Per quanto riguarda le prestazioni, non ho idea di questo tipo di arrangiamento a View doppia.