sql >> Databáze >  >> RDS >> Mysql

Jak přidat několik omezení do dotazu?

Vaši otázku chápu takto. V období 01.01.2018-12.01.2018 jste měli přihlášení 3 uživatele (user_id=1,2,3). Z těchto uživatelů uživatel user_id 1 provedl 2 platby v celkové výši 250, user_id 2 provedl 1 platbu ve výši 40 a user_id 3 provedl 0 plateb, takže jejich součet je 0. Existují tedy 2 hodnoty v rozsahu 0-200 a 1 v rozsahu 200 + . Pokud je to správné pochopení, tento dotaz vám poskytne požadované výsledky:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason;

Výstup:

diapason    number_of_users
0-200       2
200 +       1

Ukázka SQLFiddle

Aktualizovat

Chcete-li přidat další řádek s celkovým počtem number_of_users , stačí přidat WITH ROLLUP do GROUP BY klauzule:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason WITH ROLLUP

Výstup:

diapason    number_of_users
0-200       2
200 +       1
(null)      3

Ve vašem aplikačním frameworku můžete využít fakt, že diapason hodnota je NULL pro výstup něco jako Total místo toho.

Aktualizováno SQLFiddle

Totéž můžete udělat také v MySQL (viz tento SQLFiddle ) zabalením tohoto dotazu jako dílčího dotazu a použitím COALESCE na diapason sloupec. V takovém případě by výstup byl:

diapason    number_of_users
0-200       2
200 +       1
Total       3


  1. Vypočítejte rozdíl mezi 2 daty/časy v Oracle SQL

  2. Vynutit selhání vnějšího SELECT, pokud vnitřní SELECT obsahuje neplatný identifikátor

  3. Databáze Zend Poslední ID vloženého řádku. (Pomocí postgres)

  4. Rozšiřte EM Grid Control na nové uzly