1

我有一个简单的“操作”表,用于记录用户操作,如下所示:

{
  label (varchar),
  timestamp
}

用户完成的每个操作都会保存一条记录。

我现在需要输出一个看起来像这样的报告:

Date, Label1Count, Label2Count, Label3Count, ... 
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...

其中 Date 是操作发生的日期,每个标签标题都是我记录的标签之一。

我可以输出类似的东西没有问题:

label, date, count
label, date, count
...

并对其进行排序,以便标签组合在一起,然后是日期。

然后我需要将其复制并粘贴到 Excel 中以匹配所需的视图。

任何想法如何使用纯 SQL 获得第一个视图?我可以使用 python 和 SQL 的组合来做到这一点,但我确信只有 SQL 可以做到这一点?

谢谢

4

2 回答 2

1

您可以crosstab在 PostGreSQL 中使用,但我不喜欢它。

所以我改用这种模式......

SELECT
  timestamp,
  SUM(CASE WHEN label = 'x' THEN 1 ELSE 0 END)           AS label_x_count,
  SUM(CASE WHEN label = 'y' THEN 1 ELSE 0 END)           AS label_y_count,
  SUM(CASE WHEN label = 'z' THEN 1 ELSE 0 END)           AS label_z_count
FROM
  yourTable
GROUP BY
  timestamp

显然,这仅在您知道要旋转的所有标签时才有效。

如果您不了解所有标签,并且想要一个具有动态列数的结果集,则需要动态 SQL (编写 SQL 的代码,特别是用于不同标签的新代码行)。没有一个静态查询可以为您做到这一点。


因为当您在设计时不知道不同的标签值时需要动态 SQL,所以规范化数据集实际上通常是数据层中最好的方法。然后,您的客户端代码可以将该规范化数据集转换为模型层中的平面文件数据集。或类似的。

出于这个原因,我经常建议不要在 SQL 环境中对数据进行透视。

于 2012-10-15T10:37:36.037 回答
0

这是表格旋转。用纯sql很难实现。但是,如果标签的案例数量是固定的,您可能会在 SELECT CASE WHEN 语句中成功。如果标签的类型不固定,您应该选择其他东西。只有一些 sql 引擎对此没有解决方案。看看这个: http ://www.postgresql.org/docs/9.1/static/tablefunc.html

于 2012-10-15T10:33:14.820 回答