【问题标题】:Summarise data by date with percentages using SQL PIVOT使用 SQL PIVOT 按日期和百分比汇总数据
【发布时间】:2020-04-09 13:51:20
【问题描述】:

我有一些看起来像这样的数据:

---------------------------------------------
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 group-by pivot summarization


【解决方案1】:

使用条件聚合。我将为此使用 SQL Server:

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)。在您使用的任何数据库中都有类似的功能。

【讨论】:

  • 太好了 - 谢谢。我认为这可以满足我的需要,而且非常优雅。您的回答中有一个小错误,Group By 中不需要“as dte”。
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多