假设我有一个返回结果的查询:
Project Year Type Amt
PJ00001 2012 1 1000
PJ00001 2012 2 1000
PJ00001 2011 1 1000
PJ00002 2012 1 1000
我想要的是:每个项目每年将有2行类型。如果该行不存在,请将其添加到Amt = 0的结果中
例如:
- 2012年PJ00001有2排1,2型 - >好。但在2011年,它只有1排1型 - >我们添加一行:PJ00001 2011 2 0
- PJ00002只有1行类型1 - >添加:PJ00002 2012 2 0
有没有办法轻松实现。我现在知道的唯一方法是创建一个像PJ_VIEW的视图。然后:
SELECT *
FROM PJ_VIEW
UNION ALL
SELECT t.PROJECT, t.YEAR_NO, 1 AS TYPE_NO, 0 AS AMT
FROM PJ_VIEW t
WHERE NOT EXISTS (SELECT 1 FROM PJ_VIEW t2 WHERE t2.PROJECT = t.PROJECT AND t2.YEAR_NO = t.YEAR_NO AND t2.TYPE_NO = 1)
UNION ALL
SELECT t.PROJECT, t.YEAR_NO, 2 AS TYPE_NO, 0 AS AMT
FROM PJ_VIEW t
WHERE NOT EXISTS (SELECT 1 FROM PJ_VIEW t2 WHERE t2.PROJECT = t.PROJECT AND t2.YEAR_NO = t.YEAR_NO AND t2.TYPE_NO = 2)
答案 0 :(得分:2)
对于基于数据库的解决方案,您需要一个CROSS JOIN。以下解决方案适用于 n 项目类型。此解决方案需要一个包含所有具有默认金额的项目类型的表。
首先创建表格:
CREATE TABLE `_projects` (
`Project` VARCHAR(20) NOT NULL,
`_Year` INT(4) NOT NULL,
`ProjectType` INT(1) NOT NULL,
`ProjectAmt` INT(11) NOT NULL
);
CREATE TABLE `_projecttypes` (
`DefaultType` INT(1) NOT NULL,
`DefaultAmt` INT(11) DEFAULT 0
);
插入项目名称,年份,项目类型和金额:
INSERT INTO `_projects`
VALUES ('PJ00001', 2012, 1, 1000),
('PJ00001', 2012, 2, 1000),
('PJ00001', 2011, 1, 1000),
('PJ00002', 2012, 1, 1000);
现在添加项目类型,默认值为0(零)或您需要的任何值:
INSERT INTO `_projecttypes`
VALUES (1,0),(2,0);
以下是将默认值0添加到任何尚未具有默认值的项目的结果中的查询。
SELECT
IFNULL(`_actualprojects`.`Project`,`der2`.`Project`) AS `_Project`,
IFNULL(`_actualprojects`.`_Year`,`der2`.`_Year`) AS `_Year`,
IFNULL(`_actualprojects`.`ProjectType`,`der2`.`DefaultType`) AS `_Type`,
IFNULL(`_actualprojects`.`ProjectAmt`,`der2`.`DefaultAmt`) AS `_Amt`
FROM
( SELECT DISTINCT `der1`.`DefaultType`,
`der1`.`Project`,
`der1`.`_Year`,
`der1`.`DefaultAmt`
FROM
( SELECT *
FROM `_projecttypes` CROSS JOIN `_projects`
) AS `der1`
) AS `der2`
LEFT JOIN `_projects` AS `_actualprojects`
ON `der2`.`Project` = `_actualprojects`.`Project`
AND `der2`.`_Year` = `_actualprojects`.`_Year`
AND `der2`.`DefaultType` = `_actualprojects`.`ProjectType`
;
如果您想要更多项目类型,只需使用默认金额将它们添加到_projecttype表中,然后重新运行上述查询。
尝试一下,添加这些值,然后重新运行上面的查询。
INSERT INTO `_projecttypes`
VALUES (3,0),(4,0);
我希望这会对你有所帮助。
答案 1 :(得分:1)
使用DB2临时表尝试这样的事情。只需用查询替换名为query的表的内容即可。
WITH TypeList AS (
SELECT 1 TypeCode
UNION ALL
SELECT 2
),
query AS (
SELECT Project, [Year], [Type], Amt FROM yourQuerySource
),
DistinctProjectYears AS (
SELECT Project, [YEAR]
FROM query
GROUP BY Project, [YEAR]
),
Projects AS (
SELECT Project, [YEAR], [Type] as TypeCode, MAX(Amt) as Amt
FROM query
GROUP BY Project, [Year], [Type]
)
SELECT l.TypeCode, py.Project, py.[Year], COALESCE(t.Amt, 0) as Amt
FROM TypeList l CROSS JOIN DistinctProjectYears py
LEFT JOIN Projects t ON l.TypeCode = t.TypeCode
AND py.Project = t.Project
AND py.[Year] = t.[Year]