Sql Postgres复杂查询生成case语句

Sql Postgres复杂查询生成case语句,sql,postgresql,Sql,Postgresql,我有这样一个问题: select date, meter, sum(case when period = 1 then round(value, 2)end) as period_01, sum(case when period = 2 then round(value, 2)end) as period_02, sum(case when period = 3 then round(value, 2)end) as period_03, sum(case when pe

我有这样一个问题:

select date, meter,
   sum(case when period = 1 then round(value, 2)end) as period_01,
   sum(case when period = 2 then round(value, 2)end) as period_02,
   sum(case when period = 3 then round(value, 2)end) as period_03,
   sum(case when period = 4 then round(value, 2)end) as period_04,
   sum(round(kwh, 2)) as total
from table
group by date, meter
order by date, meter;
我需要一些东西:

  • total列需要是case语句的总和。因为案例陈述是四舍五入的,所以给出的总数是错误的

  • 是否可以根据任何给定日期的时段数生成case语句列?e、 g.根据每天的月经周期数来确定

  • 日期-计量-期间…-全部的 2017-06-05 |米01 | 10 | 14 | 6 |{总计}30 2017-06-06 |米01 | 10 | 7 | 2 | 5 |{总计}24
    我想它必须首先找到每个日期有多少个句点,然后运行查询,但这远远超出了我的知识水平…

    您的第一个问题的答案是在
    求和()之后
    取整()


    第二个问题的答案基本上是“不容易”。您可以将动态SQL、
    crosstab()
    与非常复杂的表达式一起使用,或者将值放入数组/json对象中。但是没有简单的方法可以返回可变数量的列。

    我可以每天返回,因为任何指定的一天每行都有确切的周期数。(大多数时间是48天,但对于夏令时,每年有两天是46天和50天)。但我仍然需要生成case语句作为函数。或者我可以只做三个不同的查询就可以了?顺便说一句,取整仍然不能正常工作。“值”列是数字列(20,8),在某些情况下,当我使用这两种方法时,总数会以0.5分的分数表示。我将其导出到excel,然后对期间列进行合计,并将其与postgres合计进行比较,结果不同。重要的是总数是准确的,因为它是一个验证列。@Daryn。如果需要8位精度,请不要对值进行四舍五入。不幸的是,我没有信心Excel在这种情况下一定是正确的。你可能需要做一些调查,以确定哪个答案是正确的。谢谢戈登,在你的帮助下,你已经设法解决了这个问题。我只是对日期(每年2次)运行另一个查询,其中有不同数量的时段。至于四舍五入,我意识到我的仪表读数只有3dp,所以将四舍五入改为3解决了问题。 Date - MeterId - Periods . . . - Total 2017-06-05 | meter_01 | 10 | 14 | 6 | {total} 30 2017-06-06 | meter_01 | 10 | 7 | 2 | 5 | {total} 24
    select date, meter,
           round(sum(case when period = 1 then value end), 2) as period_01,
           round(sum(case when period = 2 then value end), 2) as period_02,
           round(sum(case when period = 3 then value end), 2) as period_03,
           round(sum(case when period = 4 then value end), 2) as period_04
           round(sum(kwh), 2) as total
    from table
    group by date, meter
    order by date, meter;