Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak dodać kilka ograniczeń do zapytania?

Rozumiem twoje pytanie w ten sposób. Miałeś 3 użytkowników (user_id=1,2,3) logowanie w okresie 01.01.2018-12.01.2018. Spośród tych użytkowników user_id 1 dokonał 2 płatności w łącznej wysokości 250, user_id 2 dokonał 1 płatności w wysokości 40, a user_id 3 dokonał 0 płatności, więc ich suma wynosi 0. Stąd są 2 wartości w zakresie 0-200 i 1 w zakresie 200 + . Jeśli to jest prawidłowe zrozumienie, to zapytanie da pożądane wyniki:

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;

Wyjście:

diapason    number_of_users
0-200       2
200 +       1

Demo SQLFiddle

Aktualizacja

Aby dodać kolejny wiersz z całkowitą number_of_users , po prostu dodaj WITH ROLLUP do GROUP BY klauzula:

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

Wyjście:

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

W swoim frameworku aplikacji możesz wykorzystać fakt, że diapason wartość to NULL aby wypisać coś takiego jak Total zamiast tego.

Zaktualizowany SQLFiddle

Możesz również zrobić to samo w MySQL (zobacz ten SQLFiddle ), opakowując to zapytanie jako podzapytanie i używając COALESCE na diapason kolumna. W takim przypadku wynik będzie następujący:

diapason    number_of_users
0-200       2
200 +       1
Total       3


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie kolumny Timestamp za pomocą ormlite

  2. licznik czasu pingowania kodu - czy to naprawdę prawda?

  3. Ustawienie klucza obcego bigInteger na bigIncrements w Laravel 5.4

  4. Jak odjąć zapasy i sprzedaż za pomocą podzapytania mysql?

  5. Projekt tabeli DB z wieloma wierszami i wieloma kolumnami z informacjami binarnymi