在 Firebird 中通过查询分析数据
Analyze data by query in Firebird
我需要创建一个分析数据 table 以放入 c# 中的列表视图。这是我的查询:
SELECT CL.CLIENT_CODE, CL.CLIENT_NAME,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 1, COUNT(CL.CLIENT_CODE), '') AS MONTH1,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 2, COUNT(CL.CLIENT_CODE), '') AS MONTH2,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 3, COUNT(CL.CLIENT_CODE), '') AS MONTH3,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 4, COUNT(CL.CLIENT_CODE), '') AS MONTH4,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 5, COUNT(CL.CLIENT_CODE), '') AS MONTH5,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 6, COUNT(CL.CLIENT_CODE), '') AS MONTH6,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 7, COUNT(CL.CLIENT_CODE), '') AS MONTH7,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 8, COUNT(CL.CLIENT_CODE), '') AS MONTH8,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 9, COUNT(CL.CLIENT_CODE), '') AS MONTH9,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 10, COUNT(CL.CLIENT_CODE), '') AS MONTH10,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 11, COUNT(CL.CLIENT_CODE), '') AS MONTH11,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 12, COUNT(CL.CLIENT_CODE), '') AS MONTH12
FROM CLIENTS CL INNER JOIN CJOBS J ON (CL.CLIENT_ID = J.CLIENT_ID)
GROUP BY CL.CLIENT_CODE, CL.CLIENT_NAME, EXTRACT(MONTH FROM J.CJOB_ASSIGNED)
这个查询的结果,数据是按月分析的,但它们并不是每个客户端都排成一行,而是分成许多不同的数据行:
结果如我所愿
).
您每月获得单独行的原因是因为这正是您所要求的。您按月分组,因此每个月都有自己的行。
要获得您想要的结果,您需要转换查询以首先获得您想要的每个月和客户的计数,然后才 'pivot' 将这些月份转换为每月的列。
对于第一部分,您需要这样的查询:
select client_id, extract(month from cjob_assigned), count(*)
from cjobs
group by client_id, extract(month from cjob_assigned)
现在要将其转换为数据透视表 table,每个客户一行,每月一列,您需要为每个客户执行此查询 12 次。为了使这更容易,我们可以使用 common table expression,因此我们不必每次都重复整个 select(作为简化:CTE 可以看作是内联视图)。
最终查询变为:
with jcm (client_id, monthnr, jobcount) as (
select client_id, extract(month from cjob_assigned), count(*)
from cjobs
group by client_id, extract(month from cjob_assigned)
)
select client_code, client_name,
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 1) as month1,
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 2) as month2,
-- ... add months 3 - 11
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 12) as month12
from clients
顺便说一句:您可能还想考虑包括年份(尽管这确实让事情变得有点复杂)。
我需要创建一个分析数据 table 以放入 c# 中的列表视图。这是我的查询:
SELECT CL.CLIENT_CODE, CL.CLIENT_NAME,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 1, COUNT(CL.CLIENT_CODE), '') AS MONTH1,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 2, COUNT(CL.CLIENT_CODE), '') AS MONTH2,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 3, COUNT(CL.CLIENT_CODE), '') AS MONTH3,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 4, COUNT(CL.CLIENT_CODE), '') AS MONTH4,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 5, COUNT(CL.CLIENT_CODE), '') AS MONTH5,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 6, COUNT(CL.CLIENT_CODE), '') AS MONTH6,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 7, COUNT(CL.CLIENT_CODE), '') AS MONTH7,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 8, COUNT(CL.CLIENT_CODE), '') AS MONTH8,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 9, COUNT(CL.CLIENT_CODE), '') AS MONTH9,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 10, COUNT(CL.CLIENT_CODE), '') AS MONTH10,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 11, COUNT(CL.CLIENT_CODE), '') AS MONTH11,
IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 12, COUNT(CL.CLIENT_CODE), '') AS MONTH12
FROM CLIENTS CL INNER JOIN CJOBS J ON (CL.CLIENT_ID = J.CLIENT_ID)
GROUP BY CL.CLIENT_CODE, CL.CLIENT_NAME, EXTRACT(MONTH FROM J.CJOB_ASSIGNED)
这个查询的结果,数据是按月分析的,但它们并不是每个客户端都排成一行,而是分成许多不同的数据行:
结果如我所愿
您每月获得单独行的原因是因为这正是您所要求的。您按月分组,因此每个月都有自己的行。
要获得您想要的结果,您需要转换查询以首先获得您想要的每个月和客户的计数,然后才 'pivot' 将这些月份转换为每月的列。
对于第一部分,您需要这样的查询:
select client_id, extract(month from cjob_assigned), count(*)
from cjobs
group by client_id, extract(month from cjob_assigned)
现在要将其转换为数据透视表 table,每个客户一行,每月一列,您需要为每个客户执行此查询 12 次。为了使这更容易,我们可以使用 common table expression,因此我们不必每次都重复整个 select(作为简化:CTE 可以看作是内联视图)。
最终查询变为:
with jcm (client_id, monthnr, jobcount) as (
select client_id, extract(month from cjob_assigned), count(*)
from cjobs
group by client_id, extract(month from cjob_assigned)
)
select client_code, client_name,
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 1) as month1,
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 2) as month2,
-- ... add months 3 - 11
(select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 12) as month12
from clients
顺便说一句:您可能还想考虑包括年份(尽管这确实让事情变得有点复杂)。