Autor Zpráva
Kcko
Profil
Potřebuji tohle převést do Window funkce (OVER()).

Těch bucketů (částek) tam bude třeba 10. SQL dotaz by byl dlouhý i když jej lze vygenerovat v PHPku.

Zajímá mě, jestli to jde přepsat do WINDOWS funkcí, nepodporují WHERE, co jsem se díval.


SELECT 
500 AS 'bucket',
COUNT(*) cnt,
SUM(total_price) `sum`
FROM `order`
WHERE total_price <= 500
UNION ALL

SELECT 
1000 AS 'bucket',
COUNT(*) cnt,
SUM(total_price) `sum`
FROM `order`
WHERE total_price <= 1000
Kajman
Profil
Asi by mělo jít něco jako

SELECT   bucket,
         sum(cnt) over(ORDER BY bucket)      cnt,
         sum(`sum`) over(ORDER BY bucket) AS sum
FROM     (
                  SELECT   vypocet_bucket_dle_price AS bucket,
                           count(*)                 AS cnt,
                           sum(total_price)         AS sum
                  FROM     `order`
                  GROUP BY vypocet_bucket_dle_price ) t
ORDER BY bucket 
Kcko
Profil
Jasně, chápu, vypadá to dobře.
Je to pomalejší než první verze s UNION.

Ještě je tu problém, že součastí toho bucket přehledu má být cena "celková", tj. neomezená hranicí.

Takže takhle

SELECT   bucket,
         sum(cnt) over(ORDER BY bucket)      cnt,
         sum(`sum`) over(ORDER BY bucket) AS sum
FROM     (
                  SELECT   
                        CASE
                        WHEN (total_price <= 500) THEN 500
                        WHEN (total_price <= 1000) THEN 1000
                        WHEN (total_price <= 2000) THEN 2000
                        WHEN (total_price > -1) THEN 'XXX'
                        END
                         AS bucket,
                           count(*)                 AS cnt,
                           sum(total_price)         AS sum
                  FROM     `order`
                  GROUP BY bucket ) t
ORDER BY bucket 
Kajman
Profil
Ještě si můžeš vygenerovat z php jen hranice těch bucketů. A nad tím seznamem hranic udělat 2 korelované dotazy na count a sum pro každou z hranic.
Kcko
Profil
Kajman:
Takhle?

SELECT
bucket,
(SELECT COUNT(*) FROM `order` WHERE total_price <= tmp.bucket) cnt,
(SELECT SUM(total_price) FROM `order` WHERE total_price <= tmp.bucket) total
FROM

(
    SELECT 500 bucket
    UNION 
    SELECT 1000
    UNION 
    SELECT 2000
) tmp

GROUP BY tmp.bucket



Nejrychlejší je pořád UNION verze.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0