2 отдельных столбца, всего 6 отображаемых столбцов в 4 таблицах

#sql #oracle #distinct

#sql #Oracle #разные

Вопрос:

Я пытаюсь выполнить запрос в Oracle, где я хочу выполнить отдельный выбор для 2 столбцов ( position , at.task_number ), но в целом я все еще хочу отобразить дополнительные 4 столбца.

Я понимаю, что Oracle просто использует distinct для всех используемых столбцов, а не только для предложения order в любом случае. Если я удалю уточнения APP_GRP и ag.app_group_cd , то мой запрос выдаст мне желаемый результат, но мне также нужно отобразить эти столбцы.

Вот как выглядит мой select сегодня, но он не дает мне того, что я хочу.

 select distinct
(select cv.display from code_value cv where cv.code_value = ag.position_cd) AS POSITION, AG.POSITION_CD,
(select cv.display from code_value cv where cv.code_value = ag.app_group_cd) AS APP_GRP, ag.app_group_cd, 
at.task_number, at.description, Users=count(ag.position_cd)
from
application_group ag, application_task at, task_access ta, code_value cv
plan cv
where cv.code_set= 78
and cv.active_ind = 1
and cv.begin_effective_dt_tm <= SYSDATE
and cv.end_effective_dt_tm >= SYSDATE
join ag
where ag.position_cd = cv.code_value
join ta
where ta.app_group_cd = ag.app_group_cd
join at
where at.task_number = ta.task_number
and at.task_number in (1, 2, 3, 4, 5, 6)
and at.active_ind = 1
join d
group by
ag.position_cd, ag.app_group_cd, at.task_number, at.description
having
COUNT(ag.position_cd)>0
order by position, at.task_number
  

ОБНОВЛЕНО

Мой запрос возвращает что-то вроде этого…

ПОЗИЦИЯ——APP_GRP——НОМЕР ЗАДАЧИ

zzzDBA————- Администратор базы данных———————1
zzzDBA————- Администратор базы данных———————4
zzzDBA————- Администратор базы данных———————3
zzzDBA————- Администратор базы данных———————5
zzzDBA————- Администратор базы данных———————2
zzzDBA————- Администратор базы данных——————— 3

zzzDBA————- Администратор базы данных——————— 4

zzzDBA————- Администратор базы данных——————— 5

В конечном счете я хочу добраться туда, куда я только возвращаюсь:

ПОЗИЦИЯ——APP_GRP——НОМЕР ЗАДАЧИ

zzzDBA————- Администратор базы данных———————1
zzzDBA————- Администратор базы данных———————4
zzzDBA————- Администратор базы данных———————3
zzzDBA————- Администратор базы данных———————5
zzzDBA————- Администратор базы данных———————2
«удаление» строк dup для TASK_NUMBER В (3, 4, 5)

Ответ №1:

Если вы не получаете различных значений для этих двух полей, то это означает, что в полях APP_GRP и ag.app_group_cd возвращается несколько значений.

Если вы примените что-то вроде MAX() к этим полям и удалите ag.app_group_cd из своего оператора GROUP BY, вы, вероятно, получите разные значения, но вы, по сути, скрываете тот факт, что комбинация дает несколько значений для APP_GRP и ag.app_group_cd .

Если это не имеет смысла, было бы проще просмотреть примеры результатов запроса для того, что вы ожидаете увидеть, и что возвращает ваш запрос.

Комментарии:

1. Я добавил комментарий к исходному сообщению, чтобы помочь сохранить часть форматирования

2. Однако это не относится к вашему вопросу — в этом примере данных показаны только два разных поля. Это выбранные дополнительные поля, которые вызывают дублирование, нет?

Ответ №2:

Этот запрос, казалось, сделал свое дело…

 SELECT      tn.Position,
tn.Task_Number,
tn.TotalPosCd,
maxapp.MaxAppGroupCD,
ta.Description,
appgrp.display AS APP_GRP

FROM
        (SELECT     cv.display AS Position,
                    at.Task_Number,
                    COUNT(ag.position_code) AS TotalPosCd
        FROM  APPLICATION_TASK AT ,
                    TASK_ACCESS TA ,
                    APPLICATION_GROUP AG ,
                    CODE_VALUE CV
        WHERE AG.POSITION_CD  =    CV.CODE_VALUE 
                    AND TA.APP_GROUP_CD = AG.APP_GROUP_CD 
                    AND AT.TASK_NUMBER =  TA.TASK_NUMBER 
                    AND CV.CODE_SET =  88
                    AND CV.ACTIVE_IND =  1
                    AND CV.BEGIN_EFFECTIVE_DT_TM <= SYSDATE
                    AND CV.END_EFFECTIVE_DT_TM >=  SYSDATE
                    AND AT.TASK_NUMBER IN (1,2,3,4,5,6)
                    AND AT.ACTIVE_IND = 1 
        GROUP BY    cv.display,
                          at.Task_Number
        HAVING      COUNT(ag.Position_code) > 0
        ) tn,
        (SELECT ta.Task_Number,
                    MAX(ag.App_Group_CD) AS MaxAppGroupCD
        FROM  TASK_ACCESS ta,
                    APPLICATION_TASK at,
                    APPLICATION_GROUP ag
        WHERE tn.Task_number = ta.Task_number
                    AND ta.Task_Number = at.Task_number
                    AND ta.App_Group_CD = ag.App_Group_CD
        GROUP BY ta.Task_number
        ) maxapp,
        TASK_ACCESS ta,
        CODE_VALUE appgrp

WHERE tn.Task_number = maxapp.Task_Number
        AND maxapp.MaxAppGroupCD = ta.app_group_cd
        AND tn.Task_Number = ta.Task_Number
        AND maxapp.MaxAppGroupCD = appgrp.Code_Value