SQL在多个条件下按月和按年生成结果

SQL在多个条件下按月和按年生成结果,sql,database,postgresql,Sql,Database,Postgresql,我试图创建一个SQL到每月/每年的结果中。我正在计算确定状态的文档数量。 我已经有了一个SQL,它提供了我所需要的部分内容。 这里有一个简短的例子: SELECT _waiting.wt, _concluded.cc FROM tb_status as st LEFT JOIN ( SELECT count(*) as wt FROM tb_status as st LEFT JOIN tb_document as dc ON st.iddocument = dc.

我试图创建一个SQL到每月/每年的结果中。我正在计算确定状态的文档数量。 我已经有了一个SQL,它提供了我所需要的部分内容。 这里有一个简短的例子:

 SELECT _waiting.wt, _concluded.cc
 FROM tb_status as st
 LEFT JOIN (
    SELECT count(*) as wt
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Waiting%') as _waiting ON st.iddocument = st.iddocument
 LEFT JOIN (
    SELECT count(*) as cc
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Concluded%') as _concluded ON st.iddocument = st.iddocument
 GROUP BY _waiting.wt, _concluded.cc
+-----------+-----------------+
|    wt     |       cc        |
+-----------+-----------------+
| 2         | 2               |
+-----------+-----------------+
+-----------+-----------------+------------------+
|   month   |      year       |     count        |
+-----------+-----------------+------------------+
| Nov       | 2016            | 1                |
+-----------+-----------------+------------------+
| Dec       | 2016            | 1                |
+-----------+-----------------+------------------+
| Mar       | 2017            | 2                |
+-----------+-----------------+------------------+
+-----------+-----------------+------------------+------------------+
|   month   |      year       |     wt           |        cc        |
+-----------+-----------------+------------------+------------------+
| Nov       | 2016            | 1                | 0 (or null)      |
+-----------+-----------------+------------------+------------------+
| Dec       | 2016            | 0 (or null)      | 1                |
+-----------+-----------------+------------------+------------------+
| Mar       | 2017            | 1                | 1                |
+-----------+-----------------+------------------+------------------+
此SQL准确地显示了我有多少文档处于这两种状态(已结束和等待)。如以下示例所示:

 SELECT _waiting.wt, _concluded.cc
 FROM tb_status as st
 LEFT JOIN (
    SELECT count(*) as wt
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Waiting%') as _waiting ON st.iddocument = st.iddocument
 LEFT JOIN (
    SELECT count(*) as cc
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Concluded%') as _concluded ON st.iddocument = st.iddocument
 GROUP BY _waiting.wt, _concluded.cc
+-----------+-----------------+
|    wt     |       cc        |
+-----------+-----------------+
| 2         | 2               |
+-----------+-----------------+
+-----------+-----------------+------------------+
|   month   |      year       |     count        |
+-----------+-----------------+------------------+
| Nov       | 2016            | 1                |
+-----------+-----------------+------------------+
| Dec       | 2016            | 1                |
+-----------+-----------------+------------------+
| Mar       | 2017            | 2                |
+-----------+-----------------+------------------+
+-----------+-----------------+------------------+------------------+
|   month   |      year       |     wt           |        cc        |
+-----------+-----------------+------------------+------------------+
| Nov       | 2016            | 1                | 0 (or null)      |
+-----------+-----------------+------------------+------------------+
| Dec       | 2016            | 0 (or null)      | 1                |
+-----------+-----------------+------------------+------------------+
| Mar       | 2017            | 1                | 1                |
+-----------+-----------------+------------------+------------------+

然后,我做了一项研究,将研究结果与月份和年份联系起来。我的表格中有每个状态的数据。我制作了以下SQL:

SELECT to_char(datestatus,'Mon') AS month, extract(year from datestatus) as year, COUNT (*) as count, 
 FROM tb_status as st 
 LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument 
    WHERE NOT EXISTS (
        SELECT * FROM tb_status as stt
        WHERE stt.idprocess=st.idprocess
        AND stt.idstatus > st.idstatus
        )
 GROUP BY year, month
这一个会产生如下示例所示的结果:

 SELECT _waiting.wt, _concluded.cc
 FROM tb_status as st
 LEFT JOIN (
    SELECT count(*) as wt
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Waiting%') as _waiting ON st.iddocument = st.iddocument
 LEFT JOIN (
    SELECT count(*) as cc
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Concluded%') as _concluded ON st.iddocument = st.iddocument
 GROUP BY _waiting.wt, _concluded.cc
+-----------+-----------------+
|    wt     |       cc        |
+-----------+-----------------+
| 2         | 2               |
+-----------+-----------------+
+-----------+-----------------+------------------+
|   month   |      year       |     count        |
+-----------+-----------------+------------------+
| Nov       | 2016            | 1                |
+-----------+-----------------+------------------+
| Dec       | 2016            | 1                |
+-----------+-----------------+------------------+
| Mar       | 2017            | 2                |
+-----------+-----------------+------------------+
+-----------+-----------------+------------------+------------------+
|   month   |      year       |     wt           |        cc        |
+-----------+-----------------+------------------+------------------+
| Nov       | 2016            | 1                | 0 (or null)      |
+-----------+-----------------+------------------+------------------+
| Dec       | 2016            | 0 (or null)      | 1                |
+-----------+-----------------+------------------+------------------+
| Mar       | 2017            | 1                | 1                |
+-----------+-----------------+------------------+------------------+
但是,当我尝试增加最后一个SQL以获得状态时,我会得到错误,或者得到多行错误的结果

p.S.:此“WHERE NOT EXISTIS()”是一种考虑每个文档最新状态的方法(因为它总是以“Waiting”开头) 通过其他人,直到“结束”)


有没有一种简单的方法可以将这两个SQL混合到一个新的SQL中?有什么建议吗?我需要这样的示例:

 SELECT _waiting.wt, _concluded.cc
 FROM tb_status as st
 LEFT JOIN (
    SELECT count(*) as wt
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Waiting%') as _waiting ON st.iddocument = st.iddocument
 LEFT JOIN (
    SELECT count(*) as cc
    FROM tb_status as st
    LEFT JOIN tb_document as dc ON st.iddocument = dc.iddocument
    WHERE NOT EXISTS (
        SELECT *
        FROM tb_status as stt
        WHERE stt.iddocument=st.iddocument
        AND stt.idstatus > st.idstatus)
    AND status LIKE '%Concluded%') as _concluded ON st.iddocument = st.iddocument
 GROUP BY _waiting.wt, _concluded.cc
+-----------+-----------------+
|    wt     |       cc        |
+-----------+-----------------+
| 2         | 2               |
+-----------+-----------------+
+-----------+-----------------+------------------+
|   month   |      year       |     count        |
+-----------+-----------------+------------------+
| Nov       | 2016            | 1                |
+-----------+-----------------+------------------+
| Dec       | 2016            | 1                |
+-----------+-----------------+------------------+
| Mar       | 2017            | 2                |
+-----------+-----------------+------------------+
+-----------+-----------------+------------------+------------------+
|   month   |      year       |     wt           |        cc        |
+-----------+-----------------+------------------+------------------+
| Nov       | 2016            | 1                | 0 (or null)      |
+-----------+-----------------+------------------+------------------+
| Dec       | 2016            | 0 (or null)      | 1                |
+-----------+-----------------+------------------+------------------+
| Mar       | 2017            | 1                | 1                |
+-----------+-----------------+------------------+------------------+

你的问题比我想象的要复杂得多。以下内容获取每个文档的最新状态:

SELECT DISTINCT ON (st.iddocument) . . .
FROM tb_status st JOIN
     tb_document dc
     ON st.iddocument = dc.iddocument
ORDER BY st.iddocument, st.idstatus DESC;
然后,可以使用子查询聚合状态值:

SELECT SUM( (status LIKE '%Waiting%')::int) as waiting,
       SUM( (status LIKE '%Concluded%')::int) as Concluded   
FROM (SELECT DISTINCT ON (st.iddocument) . . ..
      FROM tb_status st JOIN
           tb_document dc
           ON st.iddocument = dc.iddocument
      ORDER BY st.iddocument, st.idstatus DESC
     ) s;
您还可以轻松添加日期:

SELECT DATE_TRUNC('month', datestatus) as yyyymm,
       SUM( (status LIKE '%Waiting%')::int) as waiting,
       SUM( (status LIKE '%Concluded%')::int) as Concluded   
FROM (SELECT DISTINCT ON (st.iddocument) st.*  -- Are other columns needed?
      FROM tb_status st JOIN
           tb_document dc
           ON st.iddocument = dc.iddocument
      ORDER BY st.iddocument, st.idstatus DESC
     ) s
GROUP BY yyyymm
ORDER BY yyyymm;

编辑问题并显示数据结构的外观。这些查询看起来比所述目的所需的复杂得多。@GordonLinoff谢谢。是的,我计划带上我的表和完整(或部分)SQL,询问是否有更好的方法来获得相同的结果。谢谢你的回答。。我会检查一下,看看它是如何工作的。