Объедините данные двух таблиц с помощью SQL Pivot и объединений для подзапроса. - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь создать отчет, чтобы узнать количество пользователей, подписавшихся на тип уведомления.

Я застрял с подзапросами, потому что, если эти две таблицы

Таблица 1

NotificationMaster

+----+-------+
| ID | Name  |
+----+-------+
|  1 | Email |
|  2 | Push  |
|  3 | Call  |
+----+-------+

Таблица 2

NotificationPreference

+------------+------------------+------------+--------------+
| ResourceID |  NotificationID  |  IsChecked |  AccountID   |
+------------+------------------+------------+--------------+
|         23 |                1 | 1              1         |
|         36 |                2 | 0              2         |
|         45 |                3 | 1              3         |
|         23 |                1 | 0              1         |
|         36 |                2 | 1              2         |
|         45 |                3 | 0              3         | 
|         23 |                1 | 1              1         |
|         36 |                2 | 0              3         |
|         45 |                3 | 1              3         |
+------------+------------------+--------------------------+

Ожидаемый результат

Уведомление против количества ресурсов

+----------+-------+------+------+
| Accountid Email | Push | Call |
+----------+-------+------+------+
| 1        |  2    |    1 |    2 |
+----------+-------+------+------+

Другие таблицы

AccountName

+----+-------+
| ID | Name  |
+----+-------+
| 1  | Blues |
+----+-------+
| 2  | Jazz  |
+----+-------+
| 3  | Rock  |
+----+-------+

ResourceNames

+----------+----------------+-----------+
| Resource |      Name      | AccountID |
+----------+----------------+-----------+
|       23 |          MJ    |         1 |
|       36 |          Paul  |         1 |
|       45 |          Jay Z |         3 |
+----------+----------------+-----------+

Прогресс до настоящего момента

SELECT A.ID
,A.Name
    ,count(R.id) AS 'Total Resource Count'
    ,(SELECT count(DISTINCT np.resourceid)
    FROM NotificationPreference np
    INNER JOIN NotificationMaster nm ON np.notificationid = nm.id
    WHERE np.accountid = A.ID
        AND nm.id = 1
 ) AS 'Email'
FROM AccountName A
LEFT JOIN [ResourceNames] R ON A.ID = R.[AccountID]
LEFT JOIN NotificationPreference np ON np.resourceid = R.ID
GROUP BY A.ID
,A.Name

1 Ответ

1 голос
/ 04 октября 2019

Базовое условное использование COUNT():

 SELECT Accountid
     ,  COUNT( CASE WHEN nm.Name = 'Email' THEN 1 END ) as Email
     ,  COUNT( CASE WHEN nm.Name = 'Push' THEN 1 END ) as Push 
     ,  COUNT( CASE WHEN nm.Name = 'Call' THEN 1 END ) as Call
 FROM NotificationPreference np
 JOIN NotificationMaster nm
   ON np.NotificationID  = nm.id
 GROUP BY Accountid
...