dongzhanyan3667 2014-09-20 14:28
浏览 32
已采纳

Postgres到php Array

I have a table with values :

CREATE TABLE grade
(id int, name varchar(2), no int);

INSERT INTO grade
(id, name, no)
VALUES
(1, 'A', 7),
(2, 'B', 6),
(3, 'C', 10),
(4, 'D', 12),
(5, 'E', 15),
(6, 'F', 21),
(8, 'B', 16),
(7, 'F', 18),
(9, 'F', 25);

I need output in arrays to use.. i.e. :

[
  ['range','A','B','F'],
  ['0.00 - 4.41', 1, 1, 0],
  ['4.41 - 8.24', 0 , 1, 1]
  ...
  ...
  ['others', 0, 0, 1]
]

This is what I am tring (Fiddle) :

    select range, array_agg(name) as name, array_agg(count) as count
    from (
        select case
          when no between 0.00 and 4.41 then '0.00 - 4.41'
            when no between 4.41 and 8.24 then '4.41 - 8.24'
            when no between 8.24 and 14.77 then '8.24 - 14.77' 
            when no between 14.77 and 19.35 then '14.77 - 19.35' 
            when no between 19.35 and 23.00 then '19.35 - 23.00'
        else 'Others' end as range, name,  count (*) as count
        from grade
        WHERE name IN ('A','B','F') 
        group by range, name
        order by name
    ) t
    group by range

Is it possible to get desired output from db query only ? or I have use php to iterate through?

  • 写回答

1条回答 默认 最新

  • doupao6011 2014-09-22 08:02
    关注

    Found a way to archive result (Updated Fidddle):

        select range, sum(a) as a_name, 
                      sum(b) as b_name, 
                      sum(f) as f_name, 
                      sum(count) as total
        from (
            select case
              when no between 0.00 and 4.41 then '0.00 - 4.41'
                when no between 4.41 and 8.24 then '4.41 - 8.24'
                when no between 8.24 and 14.77 then '8.24 - 14.77' 
                when no between 14.77 and 19.35 then '14.77 - 19.35' 
                when no between 19.35 and 23.00 then '19.35 - 23.00'
            else 'Others' end as range, 
                    count(name = 'A' OR NULL) as A,
                    count(name = 'B' OR NULL) as B,
                    count(name = 'F' OR NULL) as F,  
                    count (*) as count
            from grade
            WHERE name IN ('A','B','F') 
            group by range, name
            order by name
        ) t
        group by range
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据