2013-09-16 4 views
0

Я хочу разделить на два столбца (PROJECT_ID и CATEGORY_NAME), и у меня возникли проблемы с написанием правильного синтаксиса. Мой запрос ниже функциональен, но когда я пытаюсь добавить дополнительное предложение over, он работает неправильно. Рекурсивный запрос использовался для конкатенации разбиения строк на project_id, создавая список админов, объединяющих и конкатенации name_last и name_first, чтобы составить список. Мне нужно использовать дополнительный элемент over, чтобы включить CATEGORY_NAME из-за администраторов в списке, которые работают в разных категориях («INVISION» AND «INSIGHT»), но находятся под одним и тем же project_id. Первый подзапросраздел на два столбца

SELECT 
     RowNumber() over (PARTITION BY F13.DIM_PROJECT_ID, F13.CATEGORY_NAME ORDER BY F13.PROJECT_NAME),  
     F13.DIM_PROJECT_ID.....etc. 

извлекает правильные данные, я просто уверен в том, чтобы тянуть, что правильные данные из разделов оба проекта и категорией. Я использую db2.

with 

    t1(rowNum, PROJECT_ID, NAME_LAST, NAME_FIRST, POINT_OF_CONTACT, PROJECT_NAME, BUSINESS_NAME) as 

    (
     SELECT 
     RowNumber() over (PARTITION BY F13.DIM_PROJECT_ID, F13.CATEGORY_NAME ORDER BY F13.PROJECT_NAME),  
     F13.DIM_PROJECT_ID, 
     F2P.NAME_LAST, 
     F2P.NAME_FIRST, 
     REPLACE(F2P.POINT_OF_CONTACT, ',', ' |') AS POINT_OF_CONTACT, 
     F13.PROJECT_NAME, 
     F2H.CATEGORY_NAME, 

FROM FACT_TABLE AS F13 
INNER JOIN ADMIN AS F2P ON F13.DIM_PROJECT_ID = F2P.DIM_PROJECT_ID 
LEFT JOIN HOURS AS F2H ON F13.DIM_PROJECT_ID = F2H.DIM_PROJECT_ID 
WHERE F2H.CATEGORY_NAME = ('INVISION') 




group by 
     F13.DIM_PROJECT_ID, 
     F13.PROJECT_NAME, 
     F2P.NAME_LAST, 
     F2P.NAME_FIRST, 
     F2P.POINT_OF_CONTACT, 
     F2H.CATEGORY_NAME 
) , 

     t2(PROJECT_ID, LIST, POINT_OF_CONTACT, PROJECT_NAME, BUSINESS_NAME, cnt) AS 
    (SELECT PROJECT_ID, 
       VARCHAR(NAME_FIRST CONCAT ' ' CONCAT NAME_LAST, 6000), 
       POINT_OF_CONTACT, 
       PROJECT_NAME, 
       CATEGORY_NAME, 
       1 
    FROM t1 
      WHERE rowNum = 1 
      UNION ALL 
    SELECT  t2.PROJECT_ID, 
       t2.list || ' | ' || t1.NAME_FIRST CONCAT ' ' CONCAT t1.NAME_LAST, 
       t1.POINT_OF_CONTACT, 
       t1.PROJECT_NAME, 
       t1.CATEGORY_NAME 
    FROM t2, t1 
      WHERE t2.project_id = t1.project_id 
      AND t2.cnt + 1 = t1.rowNum)  
    SELECT  PROJECT_ID, 
       PROJECT_NAME, 
       POINT_OF_CONTACT, 
       CATEGORY_NAME 
       list 
    FROM t2 
      WHERE (PROJECT_ID, cnt) IN (
    SELECT PROJECT_ID, MAX(rowNum) 
    FROM t1 
      GROUP BY PROJECT_ID)  

Результаты, которые я получаю производят дубликаты, но только тогда, когда второй столбец (category_name включен в пункте раздела Текущие результаты:. enter image description here

Желаемые результаты:

enter image description here

+1

Вы пытаетесь получить 2 разных набора чисел строк, один подсчет на основе каждого dim_project_id и второй набор номеров строк для каждого category_name? В общем случае полезно показать некоторые примерные данные и ожидаемые результаты ... –

+0

Первоначально это был мой подход, но я не понимал, что несколько столбцов поддерживаются разделом. Я изменил свой вопрос выше, чтобы отразить изменения, которые я сделал. Теперь я получаю повторяющиеся результаты. Я приложу образец и ожидаемые результаты. – Tone

ответ

1

Я понял это. Я добавил идентификатор для категории и разбил разделы по категориям_id и project_id.

with 

    t1(rowNum, PROJECT_ID, NAME_LAST, NAME_FIRST, POINT_OF_CONTACT, PROJECT_NAME, CATEGORY_ID, CATEGORY_NAME) as 

    (
     SELECT 
     RowNumber() over (PARTITION BY F13.DIM_PROJECT_ID, F13.CATEGORY_ID ORDER BY F13.PROJECT_NAME, F13.CATEGORY_NAME),  
     F13.DIM_PROJECT_ID, 
     F2P.NAME_LAST, 
     F2P.NAME_FIRST, 
     REPLACE(F2P.POINT_OF_CONTACT, ',', ' |') AS POINT_OF_CONTACT, 
     F13.PROJECT_NAME, 
     F13.CATEGORY_ID 
     F13.CATEGORY_NAME, 

FROM FACT_TABLE AS F13 
INNER JOIN ADMIN AS F2P ON F13.DIM_PROJECT_ID = F2P.DIM_PROJECT_ID 
LEFT JOIN HOURS AS F2H ON F13.DIM_PROJECT_ID = F2H.DIM_PROJECT_ID 
WHERE F13.CATEGORY_NAME = ('INVISION') 




group by 
     F13.DIM_PROJECT_ID, 
     F13.PROJECT_NAME, 
     F2P.NAME_LAST, 
     F2P.NAME_FIRST, 
     F2P.POINT_OF_CONTACT, 
     F13.CATEGORY_ID 
     F13.CATEGORY_NAME 
) , 

     t2(PROJECT_ID, LIST, POINT_OF_CONTACT, PROJECT_NAME, CATEGORY_ID, CATEGORY_NAME, cnt) AS 
    (SELECT PROJECT_ID, 
       VARCHAR(NAME_FIRST CONCAT ' ' CONCAT NAME_LAST, 6000), 
       POINT_OF_CONTACT, 
       PROJECT_NAME, 
       CATEGORY_ID, 
       CATEGORY_NAME, 
       1 
    FROM t1 
      WHERE rowNum = 1 
      UNION ALL 
    SELECT  t2.PROJECT_ID, 
       t2.list || ' | ' || t1.NAME_FIRST CONCAT ' ' CONCAT t1.NAME_LAST, 
       t1.POINT_OF_CONTACT, 
       t1.PROJECT_NAME, 
       t1.CATEGORY_ID, 
       t1.CATEGORY_NAME 
    FROM t2, t1 
      WHERE t2.project_id = t1.project_id 
      AND t2.category_id = t1.category_id 
      AND t2.cnt + 1 = t1.rowNum)  
    SELECT  PROJECT_ID, 
       PROJECT_NAME, 
       POINT_OF_CONTACT, 
       CATEGORY_ID, 
       CATEGORY_NAME 
       list 
    FROM t2 
      WHERE (PROJECT_ID, CATEGORY_ID, cnt) IN (
    SELECT PROJECT_ID, CATEGORY_ID, MAX(rowNum) 
    FROM t1 
      GROUP BY PROJECT_NAME) 
Смежные вопросы