Суммируйте данные по дате с процентами, используя SQL PIVOT - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть некоторые данные, которые выглядят примерно так:

---------------------------------------------
ID |EVENTDATETIME    |CATEGORY |SOMEPROPERTY
---------------------------------------------
1  |20/03/2020 14:30 |CAT A    |1
2  |20/03/2020 16:10 |CAT B    |1
3  |20/03/2020 09:14 |CAT A    |1
4  |20/03/2020 10:26 |CAT A    |0
5  |21/03/2020 11:31 |CAT B    |1
6  |21/03/2020 10:26 |CAT B    |0
7  |22/03/2020 11:31 |CAT A    |1
---------------------------------------------

По сути, мне нужно (в SQL) как-то повернуть эти данные примерно так:

---------------------------------------------
DAY |MONTH |YEAR |TOTAL ITEMS |SOMEPROPERTY% 
---------------------------------------------
20  |MARCH |2020 |4           |75%          
21  |MARCH |2020 |2           |50%
22  |MARCH |2020 |1           |100%
---------------------------------------------

Где SOMEPROPERTY% - это% от общего числа элементов в тот день, когда для свойства установлено значение 1 (это может быть 1 или 0).

Мне также может понадобиться добавить CATEGORY в качестве дополнительного уровня, чтобы данные также группируются по этому:

-------------------------------------------------------
DAY |MONTH |YEAR |CATEGORY |TOTAL ITEMS |SOMEPROPERTY% 
-------------------------------------------------------
20  |MARCH |2020 |CAT A    |3           |66%          
20  |MARCH |2020 |CAT B    |1           |100%          
21  |MARCH |2020 |CAT B    |2           |50%
22  |MARCH |2020 |CAT A    |1           |100%
-------------------------------------------------------

Кто-нибудь может помочь?

Нужно быть одним оператором SQL - я пытался сделать это с помощью GROUP BY, но получилось довольно грязно и дает странные результаты. Я думаю, что это возможно с PIVOT, но я не могу найти хороший пример, и это не самая простая команда для игры.

nb Я знаю, что такого рода вещи обычно делаются на уровне представления, а не чем непосредственно в SQL, но у меня нет этой возможности, где это необходимо.

Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2020

Использовать условную агрегацию. Я собираюсь предположить SQL Сервер для этой цели:

select convert(date, eventdatetime) as dte, category,
       count(*) as total_items,
       avg( someproperty * 1.0 ) as ratio
from t
group by convert(date, eventdatetime), category;

Нет необходимости указывать год / месяц / день в отдельных столбцах.

Эквивалентная функция в Oracle будет trunc(eventdatetime). В любой используемой вами базе данных есть аналогичные функции.

...