/ / mysql kompozit, ak je stĺpec zo zložených hodnôt? - mysql, if-Statement, kompozitné

mysql zložený, ak stĺpec z kompozitných hodnôt? - mysql, if-statement, composite

K výsledkom dotazov musím pridať ďalší stĺpec,

Stĺpec sa musí nazývať percentom, ak col1 == 0 potom percent by mala obsahovať NIS inak percent by mala obsahovať ceil(col2 / col1 * 100)

Preto si myslím, že by malo fungovať toto:

IF(col1 = 0, "NIS", ceil(col2 / col1 * 100)) as percent

Ale narazil som na problém, pretože col1 a col2 sú tiež zložené.

COUNT(distinct i.id) as col1
COUNT(distinct q.id) as col2

Tak som zasiahnutý

Neznámy stĺpec „col1“ v „zozname polí“

S týmto problémom by som sa mohol obísť
IF(COUNT(distinct i.id) = 0, "NIS", ceil(COUNT(distinct q.id) / COUNT(distinct i.id) * 100)) as percent

Ale zdá sa mi to ako kopa ďalšieho spracovania, určite existuje lepší spôsob, ako to obísť?

Úplný dopyt

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

odpovede:

1 pre odpoveď č. 1

Ako už bolo uvedené v SELECT syntax:

Nie je dovolené odvolávať sa na alias stĺpca v a WHERE klauzula, pretože hodnota stĺpca sa ešte nemusí určiť, keď WHERE klauzula je vykonaná. vidieť Oddiel C.5.5.4 „Problémy so stĺpcovými aliasy“.

Aj keď sa v príručke výslovne neuvádza, rovnaké odôvodnenie sa vzťahuje aj na odkaz na stĺpcový alias v rámci a select_expr.

Svoj dotaz môžete umiestniť do poddotazu na vonkajší, ktorý počíta percent pomocou aliasu stĺpca:

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

Nemyslím si však, že by to malo naozaj zmysel veriť (Hľadám referenciu, ktorú môžem citovať, ale zatiaľ nič neprišiel) MySQL bude počítať iba každú COUNT() raz a použite výsledok z vyrovnávacej pamäte v každom odkaze.