Mysql
 sql >> Database >  >> RDS >> Mysql

Come aggiungere alcune restrizioni a una query?

Capisco la tua domanda come questa. Hai avuto 3 utenti (user_id=1,2,3) login nel periodo 01.01.2018-12.01.2018. Di questi utenti, user_id 1 ha effettuato 2 pagamenti per un totale di 250, user_id 2 ha effettuato 1 pagamento di 40 e user_id 3 ha effettuato 0 pagamenti, quindi il loro totale è 0. Quindi ci sono 2 valori nell'intervallo 0-200 e 1 nell'intervallo 200 + . Se questa è la comprensione corretta, questa query ti darà i risultati desiderati:

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;

Uscita:

diapason    number_of_users
0-200       2
200 +       1

Demo SQLFiddle

Aggiorna

Per aggiungere un'altra riga con il totale number_of_users , aggiungi semplicemente WITH ROLLUP al GROUP BY clausola:

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

Uscita:

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

Nel framework della tua applicazione puoi usare il fatto che il diapason il valore è NULL per produrre qualcosa come Total invece.

SQLFiddle aggiornato

Puoi anche fare lo stesso in MySQL (vedi questo SQLFiddle ) racchiudendo questa query come sottoquery e utilizzando un COALESCE sul diapason colonna. In tal caso l'output sarebbe:

diapason    number_of_users
0-200       2
200 +       1
Total       3