Published on

December 27, 2000

Представление данных SQL Server в формате кросс-таблицы

При анализе данных в SQL Server часто необходимо представить результаты в формате, удобном для анализа и презентации. В этой статье мы рассмотрим, как представить данные из таблиц EMPLOYEES и ORDERS в формате кросс-таблицы с использованием оператора CASE.

Предположим, у нас есть аналитик данных, который хочет узнать, сколько заказов было размещено каждым сотрудником в каждый год работы. Простой запрос GROUP BY может дать ответ:

SELECT E.LastName, E.FirstName, 'Year' = DATEPART(year, OrderDate), 'OrdersPlaced' = COUNT(*)
FROM EMPLOYEES E, ORDERS O
WHERE E.EmployeeID = O.EmployeeID
GROUP BY E.LastName, E.FirstName, DATEPART(year, OrderDate)

Этот запрос даст нам набор результатов, в котором перечислены фамилия, имя, год и количество размещенных заказов для каждого сотрудника:

ФамилияИмяГодРазмещенные заказы
БьюкененСтивен199611
БьюкененСтивен199718
БьюкененСтивен199813
КаллаханЛаура199619
КаллаханЛаура199754
КаллаханЛаура199831

Хотя этот набор результатов является правильным и предоставляет необходимую информацию, он может быть неудобным для анализа и не может быть непосредственно вставлен в документ презентации. Чтобы представить данные более естественным и удобным способом, мы можем использовать оператор CASE для имитации запроса кросс-таблицы.

Оператор CASE позволяет нам проверить, попадает ли запись под указанное условие и присвоить значение 1 (истина) или 0 (ложь) на основе этого условия. Используя оператор SUM, мы можем затем рассчитать общее количество размещенных заказов для каждого сотрудника, группируя результаты по их фамилии и имени:

SELECT E.LastName, E.FirstName,
       '1996' = SUM(CASE WHEN DATEPART(year, OrderDate) = 1996 THEN 1 ELSE 0 END),
       '1997' = SUM(CASE WHEN DATEPART(year, OrderDate) = 1997 THEN 1 ELSE 0 END),
       '1998' = SUM(CASE WHEN DATEPART(year, OrderDate) = 1998 THEN 1 ELSE 0 END)
FROM EMPLOYEES E, ORDERS O
WHERE E.EmployeeID = O.EmployeeID
GROUP BY E.LastName, E.FirstName

Результатом этого запроса будет формат кросс-таблицы, в котором перечислены фамилия, имя и количество заказов, размещенных каждым сотрудником для каждого года:

ФамилияИмя199619971998
ФуллерАндрей164139
ДодсвортЭнн51919
ЛеверлингДжанет187138
КаллаханЛаура195431
ПикокМаргарет318144
СуямаМайкл153319
ДаволиоНэнси265542
КингРоберт113625
БьюкененСтивен111813
ФуллерАндрей164139
ДодсвортЭнн51919

Этот формат кросс-таблицы более естественный и удобный для анализа и может быть легко скопирован и вставлен в документ презентации.

Если у вас есть вопросы или вы хотите предложить свои комментарии по улучшению этого метода, пожалуйста, не стесняйтесь связаться со мной по адресу msmirnov@swynk.com.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.