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 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作