Нужна помощь, чтобы написать SQL сводный запрос - PullRequest
0 голосов
/ 07 августа 2020

Это моя схема таблицы User, и мне нужен следующий набор результатов. Я использую сервер MS SQL.

enter image description here

I have tried with SQL server Pivot but it will show wrong result.

My Pivot Query

  SELECT * FROM (
    SELECT [ID],[Email],[DepartmentName]
      FROM [dbo].[User]) U
      PIVOT (
      COUNT([DepartmentName]) 
      FOR [DepartmentName] IN( [D1],[D2],[D3],[D4])
  ) AS pivot_table;

Above query will show the following result.

введите описание изображения здесь

Показывает несколько строк адресов электронной почты. Мне нужна только одна пользовательская строка.

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Удалите [ID], потому что он уникален.

  SELECT * FROM (
    SELECT [Email],[DepartmentName]
      FROM [dbo].[User]) U
      PIVOT (
      COUNT([DepartmentName]) 
      FOR [DepartmentName] IN( [D1],[D2],[D3],[D4])
  ) AS pivot_table;
1 голос
/ 07 августа 2020

Это не работает, потому что вы группируетесь как на ID, так и на Email. Каждая строка имеет различное значение для ID и, следовательно, несколько строк для каждого адреса электронной почты (по одной для каждого идентификатора).

Однако я всегда предпочитаю перекрестную таблицу оператору PIVOT. Его можно переносить между диалектами, и он менее жесткий:

SELECT Email,
       COUNT(CASE Department WHEN 'D1' THEN 1 END) AS D1,
       COUNT(CASE Department WHEN 'D2' THEN 1 END) AS D2,
       COUNT(CASE Department WHEN 'D3' THEN 1 END) AS D3,
       COUNT(CASE Department WHEN 'D4' THEN 1 END) AS D4
FROM dbo.YourTable YT
GROUP BY Email;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...