• postgresql行转列


    问:怎么分页&&按条件&&按顺序&&姓名不重复查出数据?

    答:其实就是行转列,那么,postgresql怎么进行转列呢,百度了下,大概有三种写法

    写法1 

    group by + sum + case when

    select name,
    sum(case when zbfm='年龄' then value else 0 end) as 年龄,
    sum(case when zbfm='身高' then value else 0 end) as 身高,
    sum(case when zbfm='体重' then value else 0 end) as 体重
    from test group by name
    having name like '%1' and length(name)=4 order by 年龄 desc

    写法2

    用postgresql的crosstab交叉函数

    crosstab(unknown, unknown) does not exist

    select * from
    crosstab(
    'select name,zbfm,value from test where name like ''%1'' and length(name)=4',$$values('年龄'), ('身高'), ('体重')$$) as score(name text, 年龄 int, 身高 int, 体重 int) order by 年龄 desc

    写法3

    group by + string_agg + split_part(分组,行转列,字符切割)

    select name, 
    split_part(split_part(temp,',',1),':',2) as 年龄,
    split_part(split_part(temp,',',2),':',2) as 身高,
    split_part(split_part(temp,',',3),':',2) as 体重
    from(
    select name, string_agg(zbfm||':'||value,',') as temp from test
    group by name 
    having name like '%1' and length(name)=4
    ) as t order by 年龄 desc

    group by + string_agg

    select name, string_agg(zbfm||':'||value,',') from test
    group by name 
    having name like '%1' and length(name)=4

     

    其他

    建表语句

    CREATE TABLE test
    (
      id serial NOT NULL,
      value integer,
      name character varying,
      zbfm character varying,
      CONSTRAINT pkey PRIMARY KEY (id)
    )

    插入数据(python)

    import psycopg2
    from random import random
    conn = psycopg2.connect(database="postgres", user="postgres", password="password", host="ip", port="port")
    cur = conn.cursor()
    
    def insertData():
        names = ['路人甲', '王尼玛', '唐马儒']
        zbfms = ['年龄', '身高', '体重']
    
        for i in range(100):
            sqlstr = 'insert into test(name, zbfm, value) values'
            for j in range(100):
                for name in names:
                    for zbfm in zbfms:
                        sqlstr += "('%s','%s',%d),"%(name+str(i*100+j),zbfm,int(100*random()))
            cur.execute(sqlstr[:-1])
            conn.commit()
            print(i)
    
    if __name__ == '__main__':
        insertData()
        selectData()

    参考

    PostgreSQL 实现交叉表(行列转换)的五种方法

  • 相关阅读:
    Space Ant(极角排序)
    Marriage Match II(二分+并查集+最大流,好题)
    Leapin' Lizards(经典建图,最大流)
    Food(最大流)
    99. Recover Binary Search Tree
    97. Interleaving String
    100. Same Tree
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
  • 原文地址:https://www.cnblogs.com/lurenjia1994/p/9535899.html
Copyright © 2020-2023  润新知