0

次のような結果を返すクエリがあるとします。

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の2つの行があります->OK。しかし、2011年には、タイプ1の行は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)
4

2 に答える 2

2

データベースベースのソリューションの場合、CROSSJOINが必要です。次のソリューションは、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);

これがお役に立てば幸いです。

于 2012-11-07T04:53:45.293 に答える
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]
于 2012-11-07T04:58:11.100 に答える