Запрос: у меня есть 4 строки, мне нужно добавить результаты из 3 строк в одну и оставить последний ряд без изменений - PullRequest
0 голосов
/ 13 ноября 2018

У меня каверна на этот вопрос. Сначала код:

SELECT user_type.user_type_description,COUNT(incident.user_id) as Quantity
FROM incident
INNER JOIN user ON incident.user_id=user.user_id
INNER JOIN user_type ON user.user_type=user_type.user_type
WHERE incident.code=2
GROUP BY user.user_type

Что я делаю?

Например, я подсчитываю полицейские сообщения о грабежах от разных пользователей. В моем примере пользователи «admin» сообщили о 6 инцидентах с кодом «2» (ограбление) и т. Д., Как показано в предложении «где» (инцидент должен быть ограблением, также код 2).

это дает следующий результат:

+-----------------------+----------+
| user_type_description | Quantity |
+-----------------------+----------+
| Admin                 |        6 |
| Moderator             |        8 |
| Fully_registered_user |        8 |
| anonymous_user        |        9 |
+-----------------------+----------+

В основном Admin,Moderator and Fully_registered_user являются appropriately registered users. Мне нужно добавить их в результат, где он показывает, как:

+--------------+------------+
| Proper_users | Anonymous  |
+--------------+------------+
|           22 |          9 |
+--------------+------------+

Я не в порядке с sql. Любая помощь приветствуется. Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы можете попытаться использовать основную функцию агрегата условий на вашем текущем наборе результатов.

SUM с выражением CASE WHEN.

SELECT SUM(CASE WHEN user_type_description IN ('Admin','Moderator','Fully_registered_user') THEN Quantity END) Proper_users,
       SUM(CASE WHEN user_type_description = 'anonymous_user' THEN Quantity END) Anonymous
FROM (
    SELECT user_type.user_type_description,COUNT(incident.user_id) as Quantity
    FROM incident
    INNER JOIN user ON incident.user_id=user.user_id
    INNER JOIN user_type ON user.user_type=user_type.user_type
    WHERE incident.code=2
    GROUP BY user.user_type
) t1
0 голосов
/ 13 ноября 2018

Вам просто нужно условное агрегирование:

SELECT SUM( ut.user_type_description IN ('Admin', 'Moderator', 'Fully_registered_user') ) as Proper_users,
        SUM( ut.user_type_description IN ('anonymous_user') as anonymous
FROM incident i INNER JOIN
     user u
     ON i.user_id = u.user_id INNER JOIN
     user_type ut
     ON u.user_type = ut.user_type
WHERE i.code = 2;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Используется ярлык MySQL для добавления значений - просто добавляется логическое выражение.
0 голосов
/ 13 ноября 2018

Я бы решил это с CTE , но было бы лучше иметь эту связь в таблице.

WITH
user_type_categories
AS
(
    SELECT 'Admin' AS [user_type_description] , 'Proper_users' AS [user_type_category]  
    UNION SELECT 'Moderator' AS [user_type_description] , 'Proper_users' AS [user_type_category]  
    UNION SELECT 'Fully_registered_user' AS [user_type_description] , 'Proper_users' AS [user_type_category]  
    UNION SELECT 'anonymous_user' AS [user_type_description] , 'Anonymous' AS [user_type_category]  
)
SELECT 
      CASE WHEN utc.[user_type_category] = 'Proper_users' THEN
        SUM(incident.user_id) 
      END AS [Proper_Users_Quantity]
     , CASE WHEN utc.[user_type_category] = 'Anonymous' THEN
        SUM(incident.user_id) 
      END AS [Anonymous_Quantity]
FROM 
    [incident]
    INNER JOIN [user] ON [incident].[user_id] = [user].[user_id]
    INNER JOIN [user_type] ON [user].[user_type] = [user_type].[user_type]
    LEFT JOIN user_type_categories AS utc ON utc.[user_type_description] = [user_type].[user_type_description]
WHERE 
    [incident].[code] = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...