使用 SQL PIVOT 按日期按百分比汇总数据
Summarise data by date with percentages using SQL PIVOT
我有一些数据看起来像这样:
---------------------------------------------
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 可能是可行的,但我找不到一个很好的例子,而且它不是最容易使用的命令。
n.b。我知道这类事情通常会在表示层中完成,而不是直接在 SQL 中完成,但我没有在需要的地方选择。
谢谢。
使用条件聚合。为此,我将假设 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;
无需将 year/month/day 分列。
Oracle 中的等效函数是 trunc(eventdatetime)
。无论您使用什么数据库,都有类似的功能。
我有一些数据看起来像这样:
---------------------------------------------
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 可能是可行的,但我找不到一个很好的例子,而且它不是最容易使用的命令。
n.b。我知道这类事情通常会在表示层中完成,而不是直接在 SQL 中完成,但我没有在需要的地方选择。
谢谢。
使用条件聚合。为此,我将假设 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;
无需将 year/month/day 分列。
Oracle 中的等效函数是 trunc(eventdatetime)
。无论您使用什么数据库,都有类似的功能。