从每个日期的不同表中获取特定数据

时间:2017-05-28 12:38:23

标签: sql postgresql pivot-table crosstab

我有两张桌子

  • 包含列ID,日期和计数的X

  • 另一个表是Y,其中包含列id,代码。

现在我想要所提到的表单中的结果,以便在不同列中的不同日期应该有列代码,id和计数,所以它应该看起来像这样

TABLE X
        id date         count
        1  2016-08-16     20
        1  2016-08-17     34
        1  2016-08-18     56
        1  2016-08-19     67
        1  2016-08-20     87

TABLE Y
id  code
1    101
2    102
3    103
4    104
5    105

RESULT
        CODE    ID   2016-08-16 2016-08-17 2016-08-18  2016-08-19  2016-08-20                                    
        101       1  20         34         56          67          87

1 个答案:

答案 0 :(得分:0)

  1. 获得类似结果的简单方法是

    SELECT y.code, y.id, json_object_agg(x.date, x.count)
    FROM x INNER JOIN y ON x.id = y.id GROUP BY y.id, y.code
    

    如果您使用其他语言来处理查询结果,我认为这个就足够了。

  2. 如果日期列需要是动态的,我认为PL / pgSQL是必要的。

    DO $$
    BEGIN
        EXECUTE (SELECT format('CREATE TEMPORARY TABLE result AS
            SELECT code, id, %s FROM (
                SELECT y.code, y.id, json_object_agg(x.date, x.count) AS counts
                FROM x INNER JOIN y ON x.id = y.id GROUP BY y.id, y.code) as sub',
                string_agg(DISTINCT 'counts->>''' || date :: TEXT || ''' AS ' || '"' || date :: TEXT || '"', ',')
            ) FROM x);
    END
    $$ LANGUAGE plpgsql;
    SELECT * FROM result;