Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从周一开始的周间隔查询_Sql_Postgresql_Aggregate Functions_Dateinterval - Fatal编程技术网

Sql 从周一开始的周间隔查询

Sql 从周一开始的周间隔查询,sql,postgresql,aggregate-functions,dateinterval,Sql,Postgresql,Aggregate Functions,Dateinterval,我需要做一个JasperReport。我需要显示的是帐户进程的总数,按激活和拒绝帐户的数量划分为每周间隔 对于我目前得到的每周间隔查询: SELECT * FROM account_details WHERE DATE date_opened = DATE_ADD(2014-01-01, INTERVAL(1-DAYOFWEEK(2014-01-01)) +1 DAY) 这似乎是正确的,但不是POSTGRES正确的。它一直在抱怨星期一。以下是我希望实现的目标: 更新 它很难看,但我不知道还有比

我需要做一个JasperReport。我需要显示的是帐户进程的总数,按激活和拒绝帐户的数量划分为每周间隔

对于我目前得到的每周间隔查询:

SELECT *
FROM account_details
WHERE DATE date_opened = DATE_ADD(2014-01-01, INTERVAL(1-DAYOFWEEK(2014-01-01)) +1 DAY)
这似乎是正确的,但不是POSTGRES正确的。它一直在抱怨星期一。以下是我希望实现的目标:

更新 它很难看,但我不知道还有比它更好的了。不过,我是做这项工作的。但不知道是否可以重新考虑,至少看起来更好。我现在也不知道如何处理零除法

        SELECT to_char(d.day, 'YYYY/MM/DD  -  ') || to_char(d.day + 6, 'YYYY/MM/DD') AS Month
         , SUM(CASE WHEN LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END)     AS Activated
         , SUM(CASE WHEN LOWER(situation) LIKE '%declined%' THEN 1 ELSE 0 END) AS Declined
         , SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END) AS Total
         , to_char( 100.0 *( (SUM(CASE WHEN LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END)) / (SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END))::real) , '99.9') AS percent_activated
         , to_char( 100.0 *( (SUM(CASE WHEN LOWER(situation) LIKE '%declined%' THEN 1 ELSE 0 END)) / (SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END))::real) , '99.9') AS percent_declined
    FROM   (
       SELECT day::date
       FROM   generate_series('2014-08-01'::date, '2014-09-14'::date, interval '1 week') day
       ) d
    JOIN   account_details a ON a.date_opened >= d.day 
                            AND a.date_opened <  d.day + 6
    GROUP  BY d.day;
有关答案:

有关计算特定值的详细信息:


旁白:您通常会使用或查找表,只存储情况的ID,而不是冗余的冗长文本。

文字日期和时间戳值位于单引号之间,如“2014-01-01”。虽然SELECT 2014-01-01有效,但其计算结果为2012-您完全误解了文字的含义,什么是函数调用?看看这里:-列值和表达式已经有了一个类型,它们不需要注意,但有时它们需要浇铸。Fiddle链接不是Fiddle,而是另一个图像。可能是链接混淆了?好吧,现在有一把小提琴,但它与问题无关。欧文,谢谢你,但我有一个问题。在account_details(帐户详细信息)表中,用于说明帐户是活动帐户还是拒绝帐户的列是一个字符串。例如,活动-不允许加满,应用程序-拒绝客户-不联系。您将如何对字符串值求和?类似于sumLIKE'active'AS activated?或者甚至是sumSELECT regexp\u matchestituation'active'AS activated,其中情况是列名,如果我可以向您介绍的话@莫内尔:我又加了一些。
SELECT to_char(d.day, 'YYYY/MM/DD" - "')
    || to_char(d.day + 6, 'YYYY/MM/DD') AS week
     , count(situation ILIKE '%active%' OR NULL) AS activated
     , ...
FROM   (
   SELECT day::date
   FROM   generate_series('2014-08-11'::date
                        , '2014-09-14'::date
                        , '1 week'::interval) day
   ) d
LEFT   JOIN account_details a ON a.date_opened >= d.day 
                             AND a.date_opened <  d.day + 7  -- 7, not 6!
GROUP  BY d.day;