2012-11-07 24 views
0

假设我有一个返回结果,这样的查询添加一行:SQL时不存在

Project Year Type Amt 
PJ00001 2012 1 1000 
PJ00001 2012 2 1000 
PJ00001 2011 1 1000 
PJ00002 2012 1 1000 

我想要什么:每一个项目都会有2行每年类型。如果该行不存在,则将其添加到Amt = 0的结果中。
例如:
- PJ00001在2012年有1,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的记录?或者它总是1或1和2? – Chandu

+0

对于我的问题,它只有1和2.如果答案可以解决一个列表,那么这是个好消息。 –

回答

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] 
+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表的默认量,rereun上面的查询。

尝试一下,添加这些值,然后重新运行上述查询。

INSERT INTO `_projecttypes` 
    VALUES (3,0),(4,0); 

我希望这可以帮助你。

+2

欢迎来到SO! – Tahbaza

+0

谢谢你的回答。 –