Ho bisogno di aggiungere una colonna in più ai risultati della mia query,
La colonna deve essere chiamata percentuale, Se col1 == 0
poi percent
dovrebbe contenere NIS
altro percent
dovrebbe contenere ceil(col2 / col1 * 100)
Quindi credo che il seguente dovrebbe funzionare:
IF(col1 = 0, "NIS", ceil(col2 / col1 * 100)) as percent
Ma mi imbatto in un problema in quanto col1 e col2 sono anche compositi "s.
COUNT(distinct i.id) as col1
COUNT(distinct q.id) as col2
Quindi mi viene colpito
Colonna sconosciuta "col1" in "elenco campi"
Potrei risolvere il problema con
IF(COUNT(distinct i.id) = 0, "NIS", ceil(COUNT(distinct q.id) / COUNT(distinct i.id) * 100)) as percent
Ma questo mi sembra un po 'di elaborazione in più, sicuramente c'è un modo migliore per aggirare questo?
Query completa
SELECT
`t`.*,
`r`.`name` AS region_name,
GROUP_CONCAT(DISTINCT p.ptype_id SEPARATOR "|") AS ptype_ids,
COUNT(DISTINCT q.id) AS quoted,
COUNT(DISTINCT i.id) AS intended,
COUNT(DISTINCT qa.id) AS awarded,
IF(
intended = 0,
`"NIS"`,
CEIL(quoted / intended * 100)
) AS percent
FROM
(`tradesmen` t)
LEFT JOIN `regions` r
ON `r`.`id` = `t`.`region_id`
LEFT JOIN `quotes` q
ON `t`.`id` = `q`.`tradesman_id`
LEFT JOIN `quote_intentions` i
ON `t`.`id` = `i`.`tradesman_id`
LEFT JOIN `quotes` qa
ON `q`.`tradesman_id` = `qa`.`tradesman_id`
AND qa.accepted = 1
LEFT JOIN `ptypes_tradesmen` p
ON `p`.`tradesman_id` = `t`.`id`
GROUP BY `t`.`id`
LIMIT 20
risposte:
1 per risposta № 1Come menzionato in SELECT
Sintassi:
Non è consentito fare riferimento a un alias di colonna in a
WHERE
clausola, perché il valore della colonna potrebbe non essere ancora determinato quando ilWHERE
clausola viene eseguita. Vedere Sezione C.5.5.4, "Problemi con gli alias di colonna".
Anche se il manuale non lo dice esplicitamente, lo stesso ragionamento si applica al riferimento ad un alias di colonna all'interno di a select_expr
.
È possibile inserire la query in una sottoquery su una esterna che calcola percent
utilizzando gli alias di colonna:
SELECT *, IF(intended, CEIL(quoted / intended * 100), NULL) AS percent FROM (
SELECT
`t`.*,
`r`.`name` AS region_name,
GROUP_CONCAT(DISTINCT p.ptype_id SEPARATOR "|") AS ptype_ids,
COUNT(DISTINCT q.id) AS quoted,
COUNT(DISTINCT i.id) AS intended,
COUNT(DISTINCT qa.id) AS awarded
FROM
(`tradesmen` t)
LEFT JOIN `regions` r
ON `r`.`id` = `t`.`region_id`
LEFT JOIN `quotes` q
ON `t`.`id` = `q`.`tradesman_id`
LEFT JOIN `quote_intentions` i
ON `t`.`id` = `i`.`tradesman_id`
LEFT JOIN `quotes` qa
ON `q`.`tradesman_id` = `qa`.`tradesman_id`
AND qa.accepted = 1
LEFT JOIN `ptypes_tradesmen` p
ON `p`.`tradesman_id` = `t`.`id`
GROUP BY `t`.`id`
LIMIT 20
) t
Tuttavia, non penso che questo sia davvero utile come me credere (Sto cercando un riferimento che posso citare, ma non ancora disponibile) MySQL calcolerà solo ciascuno COUNT()
una volta e utilizzare il risultato memorizzato nella cache in ogni riferimento.