交叉表函数有问题。
我的桌子“t”是

date;name;hour;cause;c_p
"2013-06-12";167;14;0;2
"2013-06-12";167;16;0;3
"2013-06-12";167;16;0;4
"2013-06-12";167;19;1;1
"2013-06-12";167;19;0;4

我要这张透视表
day;name;hour;cause_0;cause_1
"2013-06-12";167;14;2;0 -----sum(c_p)
"2013-06-12";167;16;7;0
"2013-06-12";167;19;4;1

Sql代码是
SELECT  * from crosstab (
    'SELECT  day,name,hour,cause, SUM(c_p) AS c_p
        FROM t
        GROUP BY 1,2,3,4
        ORDER BY 3 ',

     'SELECT DISTINCT cause
         FROM i
         ORDER BY 1')

AS t_pivot (day date, name integer,hour integer, cause_0 integer,cause_1 integer)

查询结果是一个行表,取决于“ORDER by”
ORDER BY 3
"2013-06-12";167;14;4;1

ORDER BY 1, ORDER BY 2
"2013-06-12";167;14;7;1

错误在哪里?
谢谢
f。

最佳答案

我还没有使用过crosstab函数,现在无法测试它(sqlfiddle上没有tablefunc扩展),但一般来说,如果需要这样一个轴心点,我更喜欢简单的SQL:

select
    date,
    hour,
    sum(case when cause = 0 then c_p else 0 end) cause_0,
    sum(case when cause = 1 then c_p else 0 end) cause_1
from t
group by date, hour
order by hour

sql fiddle demo
我认为在将来维护和阅读它更容易(但这是主观意见)。
更新此工作(小时用作row_name,日期和名称为extra列):
SELECT  * from crosstab (
    'select hour, date, name, cause, sum(c_p) as c_p
     from t
     group by 1, 2, 3, 4
     order by 1',
    'select distinct cause from t order by 1')
AS t_pivot (hour integer, date timestamp, name integer, cause_0 integer,cause_1 integer)

documentation
source_sql是生成源数据集的sql语句。
此语句必须返回一行名称列、一个类别列,
以及一个值列。它也可能有一个或多个“额外”列。
“行名称”列必须是第一个。类别和值列必须
按顺序排在最后两列。行名之间的任何列
类别被视为“额外”。需要“额外”列
对于具有相同行名值的所有行都是相同的。

实际上,源sql查询应该始终指定ORDER BY 1到
确保将具有相同行名的值放在一起。
但是,在一个组中对类别排序并不重要。
此外,必须确保类别的顺序
查询的输出与指定的输出列顺序匹配。

关于sql - PostgreSQL交叉表功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18765260/

10-11 01:37