V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nuistzhou
V2EX  ›  PostgreSQL

求助 PostgreSQL 大神

  •  
  •   nuistzhou · 2019-07-12 22:38:43 +08:00 · 4857 次点击
    这是一个创建于 1993 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有 2 个表: 需要查询表 1 的 date 字段得到日期数值,然后再去表 2 里找该日期数字对应的字段名,将找到的字段名对应的值 Join 回表一。感觉要用动态 SQL,求启发。
    附上 2 个表的截图:
    表 1:
    表 1

    表 2:
    表 2

    上面可能说得太抽象,看图说话,表 1 里的第 3 行数据,对应的 date 是 2018-10,那么就要去表二里筛选过的行里的‘ 2018-10 ’这一列,把对应的值 Join 回表 1 里。

    13 条回复    2019-07-17 00:15:40 +08:00
    micean
        1
    micean  
       2019-07-12 23:00:37 +08:00
    写成存储过程?
    nuistzhou
        2
    nuistzhou  
    OP
       2019-07-12 23:18:49 +08:00
    @micean 嗯,但是不知道怎么写。。。
    niubee1
        3
    niubee1  
       2019-07-12 23:23:19 +08:00
    超过标准 SQL 的纲了。干嘛老想着一条 SQL 打天下
    c6h6benzene
        4
    c6h6benzene  
       2019-07-12 23:24:06 +08:00 via iPad
    图倒是都挂了…是要 201810 对应的列名?
    nuistzhou
        5
    nuistzhou  
    OP
       2019-07-13 00:16:17 +08:00
    @c6h6benzene ‘ 2018-10 ’就会是列名,要把这个值 Join 回表 1。 这个问题的复杂性在于,每一个记录都可能对应表 2 里不同的列名,因为它取决于每个记录的 date 值。
    reus
        6
    reus  
       2019-07-13 00:59:40 +08:00
    谁设计这个表的,真的应该开除
    mengyaoss77
        7
    mengyaoss77  
       2019-07-13 01:05:37 +08:00 via Android
    写个脚本列变行吧
    widewing
        8
    widewing  
       2019-07-13 02:00:19 +08:00 via Android
    crosstab 吧
    c6h6benzene
        9
    c6h6benzene  
       2019-07-13 11:29:06 +08:00 via Android
    @nuistzhou 后来看到图了。可能你放到 Excel 里面 HLOOKUP 会比较快。
    beginor
        10
    beginor  
       2019-07-13 15:58:26 +08:00 via Android
    表 1 crosstab 将日期行转列, 然后再和表 2 进行关联, 或者直接对表 2 进行 SQL 拼接进行嵌套查询, 应该都可以做到, 个人认为算是中等难度吧。
    Aksura
        11
    Aksura  
       2019-07-14 09:34:11 +08:00
    @nuistzhou 表 2 这种在数据仓库里挺常见的,建议楼主先把表 2 做行列转换,使日期字段名变为一列值,再与表 1 JOIN。这个在 Oracle 里用 pivot/unpivot,PostgreSQL 里建议安装 tablefunc 这个 extension (服务端安装时自带的),用它的 crosstab 函数。
    LeeSeoung
        12
    LeeSeoung  
       2019-07-14 09:48:05 +08:00
    楼上正解。。关键就是行转列 列转行
    CRVV
        13
    CRVV  
       2019-07-17 00:15:40 +08:00
    select table1.date, to_json(table2)->table1.date as v from table1 cross join table2 order by 1;

    需要再处理一下 date 转成 TEXT 类型
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:45 · PVG 23:45 · LAX 07:45 · JFK 10:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.