【问题标题】:Get certain data from different tables for each date从每个日期的不同表中获取某些数据
【发布时间】:2017-05-28 12:38:23
【问题描述】:

我有两张桌子

  • X 包含 id、date 和 count 列

  • 另一个表是 Y,列 id,code。

现在我想要上述表格中的结果,以便在不同列中的不同日期有列 code、id 和 count,所以它应该看起来像这样

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

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • @GordonLinoff 这够了吗?
  • @GordonLinoff 这只是一个样本数据,实际数据非常大
  • 您实际上有多少个独特的日期?您可以使用案例来旋转数据,但如果有很多日期,我建议您将无法编写查询,但需要编写一个程序来完成它
  • @Tik 大约 60 个日期

标签: sql postgresql pivot-table crosstab


【解决方案1】:
  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;
    

【讨论】:

  • 你能解释一下如何使用第一种方法吗?
  • 这取决于您使用哪种语言。第三列将是该语言的对象或哈希表,您可以从中读取值。
猜你喜欢
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多