Дубликаты при самостоятельном соединении столов

Я получаю дубликаты, когда присоединяюсь к своей таблице фактов. Я хочу дважды присоединиться к таблице фактов, чтобы получить некоторые агрегированные итоги. Мои результаты sql возвращают повторяющиеся проекты только тогда, когда я присоединяюсь к таблице фактов для процентных и производственных агрегатов. Возможно, есть лучший способ сделать это. Я готов к предложениям. (DB2)

SELECT distinct
DP.PROJECT_ID,
DP.PROJECT_NAME,
DM.BUILDING_NAME,
DA.AMOUNT,
cast(sum(cast(FAT.TRANSACTION_AMOUNT as real)) as integer) as GROSS,
(DA.AMOUNT - sum(FAT.TRANSACTION_AMOUNT)) as NET,
PERCENT.PERCENTAGE_USED,
PROD.PRODUCTION


FROM FACT_TABLE as FAT
    RIGHT JOIN ALCF_WAREHOUSE.DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_PROJECT DP ON FAT.DIM_PROJECT_ID = DP.DIM_PROJECT_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DD ON FAT.START_DATE_DIM_ID = DD.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T3 ON FAT.END_DATE_DIM_ID = T3.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_JOB DJ ON FAT.DIM_JOB_ID = DJ.DIM_JOB_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_BUILDING DM ON FAT.BUILDING_ID = DM.BUILDING_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T5 ON DJ.JOB_END_ID = T5.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T10 ON DJ.JOB_START_ID = T10.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DDS on DDS.DATE_KEY = DA.A_START_DATE_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DDE on DDE.DATE_KEY = DA.A_END_DATE_ID

    JOIN
    (
            SELECT DP.DIM_PROJECT_ID,
                concat(((sum(FAT.TRANSACTION_AMOUNT)/DA.AMOUNT)*100),'%') AS Percentage_used
                FROM FACT_TABLE as FAT
                INNER JOIN DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID
                INNER JOIN DIM_PROJECT DP ON FAT.DIM_PROJECT_ID = DP.DIM_PROJECT_ID
                WHERE DA.BUILDING_NAME IN ('MAIN', 'SECONDARY')
                    AND DA.TYPE_NAME = 'INVISION'
                GROUP BY DP.DIM_PROJECT_ID, DA.AMOUNT
                HAVING concat(((sum(FAT.TRANSACTION_AMOUNT)/DA.AMOUNT)*100),'%') <> '.00%'
            ) percent on DP.dim_project_id = percent.dim_project_id

      JOIN
      (
            SELECT DJ.DIM_PROJECT_ID, cast(sum(cast(FAT.TRANSACTION_AMOUNT as real)) as integer) as PRODUCTION
                FROM FACT_TABLE as FAT  
                RIGHT OUTER JOIN DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID
                INNER JOIN DIM_JOB DJ ON FAT.DIM_JOB_ID = DJ.DIM_JOB_ID                    
                WHERE DJ.SIZE in ('33% <= x <= 100%', '16% <= x < 33%')
                    AND DA.BUILDING_NAME IN ('MAIN', 'SECONDARY')
                    AND DA.TYPE_NAME = 'INVISION'
                GROUP BY DJ.DIM_PROJECT_ID
            ) PROD on DP.dim_project_id = PROD.dim_project_id 


WHERE
        ((DD.DATE_VALUE >= '2013-01-01'
        AND T3.DATE_VALUE <= '2014-01-01')
        OR (((DD.DATE_VALUE > '2013-01-01'
        AND DD.DATE_VALUE < '2014-01-01')
        OR (T3.DATE_VALUE <= '2014-01-01'
        AND T3.DATE_VALUE > '2013-01-01')
        OR (DD.DATE_VALUE <= '2013-01-01'
        AND T3.DATE_VALUE > '2014-01-01'))
        AND (T5.DATE_VALUE >= '2013-01-01'
        AND T5.DATE_VALUE < '2014-01-01')))
        AND DM.BUILDING_NAME IN ('MAIN', 'SECONDARY')
        AND DA.TYPE_NAME = 'INVISION'
        AND DDS.YEAR4 = '2013'

GROUP BY
    DP.DIM_PROJECT_ID,
    DP.PROJECT_NAME,
    DM.MACHINE_NAME,
    DA.AMOUNT,
    PERCENT.PERCENTAGE_USED,
    PROD.PRODUCTION

 ORDER BY PROJECT_NAME

Результаты запроса выше: введите описание изображения здесь

Желаемые результаты: введите описание изображения здесь


person Tone    schedule 04.09.2013    source источник
comment
Возможно, есть лучший способ сделать это. Я бы посоветовал отредактировать ваш вопрос, включив в него образцы данных и желаемые результаты. Самостоятельное присоединение к таблице фактов не кажется лучшим подходом.   -  person Gordon Linoff    schedule 04.09.2013
comment
Обратите внимание, что вам следует избегать проверок, включающих верхнюю границу, по причинам, указанным в этом сообщении блога. Хотя в нем конкретно подробно описывается SQL Server, некоторые версии DB2 допускают временные метки переменной точности, что делает все рекомендации актуальными. Обратите внимание, что ваша вторая часть в предложении WHERE на день меньше, чем год, что подозрительно / маловероятно. Также хорошо иметь в виду все типы диапазонов, поскольку проблемы не являются уникальными для значений даты / времени / отметки времени.   -  person Clockwork-Muse    schedule 05.09.2013


Ответы (1)


Я обнаружил, что предложение иметь действительно не нужно, поэтому я смог удалить соединение таблицы для процентной агрегации и вычислить процент вне самостоятельного соединения. Это удалило дубликаты.

SELECT distinct
DP.PROJECT_ID,
DP.PROJECT_NAME,
DM.BUILDING_NAME,
DA.AMOUNT,
cast(sum(cast(FAT.TRANSACTION_AMOUNT as real)) as integer) as GROSS,
(DA.AMOUNT - sum(FAT.TRANSACTION_AMOUNT)) as NET,
concat(((sum(FAT.TRANSACTION_AMOUNT)/DA.AMOUNT)*100),'%') AS Percentage_used,
PROD.PRODUCTION

FROM FACT_TABLE as FAT
    RIGHT JOIN ALCF_WAREHOUSE.DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_PROJECT DP ON FAT.DIM_PROJECT_ID = DP.DIM_PROJECT_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DD ON FAT.START_DATE_DIM_ID = DD.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T3 ON FAT.END_DATE_DIM_ID = T3.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_JOB DJ ON FAT.DIM_JOB_ID = DJ.DIM_JOB_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_BUILDING DM ON FAT.BUILDING_ID = DM.BUILDING_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T5 ON DJ.JOB_END_ID = T5.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE T10 ON DJ.JOB_START_ID = T10.DATE_KEY
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DDS on DDS.DATE_KEY = DA.A_START_DATE_ID
    INNER JOIN ALCF_WAREHOUSE.DIM_DATE DDE on DDE.DATE_KEY = DA.A_END_DATE_ID

    JOIN
      (
            SELECT DJ.DIM_PROJECT_ID, cast(sum(cast(FAT.TRANSACTION_AMOUNT as real)) as integer) as PRODUCTION
                FROM FACT_TABLE as FAT  
                RIGHT OUTER JOIN DIM_A DA ON FAT.DIM_A_ID = DA.DIM_A_ID
                INNER JOIN DIM_JOB DJ ON FAT.DIM_JOB_ID = DJ.DIM_JOB_ID                    
                WHERE DJ.SIZE in ('33% <= x <= 100%', '16% <= x < 33%')
                    AND DA.BUILDING_NAME IN ('MAIN', 'SECONDARY')
                    AND DA.TYPE_NAME = 'INVISION'
                GROUP BY DJ.DIM_PROJECT_ID
            ) PROD on DP.dim_project_id = PROD.dim_project_id 


WHERE
        ((DD.DATE_VALUE >= '2013-01-01'
        AND T3.DATE_VALUE <= '2014-01-01')
        OR (((DD.DATE_VALUE > '2013-01-01'
        AND DD.DATE_VALUE < '2014-01-01')
        OR (T3.DATE_VALUE <= '2014-01-01'
        AND T3.DATE_VALUE > '2013-01-01')
        OR (DD.DATE_VALUE <= '2013-01-01'
        AND T3.DATE_VALUE > '2014-01-01'))
        AND (T5.DATE_VALUE >= '2013-01-01'
        AND T5.DATE_VALUE < '2014-01-01')))
        AND DM.BUILDING_NAME IN ('MAIN', 'SECONDARY')
        AND DA.TYPE_NAME = 'INVISION'
        AND DDS.YEAR4 = '2013'

GROUP BY
    DP.DIM_PROJECT_ID,
    DP.PROJECT_NAME,
    DM.MACHINE_NAME,
    DA.AMOUNT,
    PROD.PRODUCTION

 ORDER BY PROJECT_NAME
person Tone    schedule 04.09.2013