SQL在多个条件下按月和按年生成结果
我试图创建一个SQL到每月/每年的结果中。我正在计算确定状态的文档数量。 我已经有了一个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.
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,询问是否有更好的方法来获得相同的结果。谢谢你的回答。。我会检查一下,看看它是如何工作的。