2012-11-07 72 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

謝謝你的回答。 –