SQL-запрос для получения данных из двух таблиц с отношением один ко многим - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь запросить некоторые данные из базы данных SQL Server, но не могу понять, как написать запрос, чтобы получить нужные данные. Ниже приведен сценарий.

CaseMaster может иметь несколько CaseStage (Предварительный, Апелляция, Исполнение, Согласование и т. Д.), И каждый CaseStage может иметь один из статусов, таких как «Новый», «В процессе», «Закрыт», «Приговор», «В ожидании» и т. Д. .).

Я хочу получить все случаи, статус стадии которых «В процессе» или статус стадии не находится в стадии выполнения, только последняя стадия, статус которой «Решено». В результирующем наборе для каждого случая должна отображаться либо та стадия, которая находится в процессе «Выполняется», либо только последняя, ​​которая является «Судейской» (не обе).

Ниже приведено то, что я пробовал до сих пор, ноон отображает как «В процессе», так и «Судебный».


SELECT
    TOP (100) PERCENT
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number
FROM
    dbo.CaseStages INNER JOIN
    dbo.CaseMaster ON dbo.CaseStages.case_id = dbo.CaseMaster.id
WHERE
    ( dbo.CaseStages.stage_status = 'In Progress' )
    OR
    ( dbo.CaseStages.stage_status <> 'In Progress')
    AND
    ( dbo.CaseStages.stage_status = 'Adjudicated')
GROUP BY
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role, 
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id, 
    dbo.CaseMaster.file_number

enter image description here

enter image description here

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Попробуй вот так (не проверено)

SELECT 
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number
FROM
    dbo.CaseStages INNER JOIN
    dbo.CaseMaster ON dbo.CaseStages.case_id = dbo.CaseMaster.id
WHERE
    ( dbo.CaseStages.stage_status = 'In Progress' )

union

SELECT
    TOP (1) 
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number
FROM
    dbo.CaseStages INNER JOIN
    dbo.CaseMaster ON dbo.CaseStages.case_id = dbo.CaseMaster.id
WHERE   
     dbo.CaseStages.stage_status = 'Adjudicated'
ORDER BY     
    dbo.CaseStages.stage_end_date  desc
0 голосов
/ 16 октября 2019

Учитывая, что у вас есть 2 различных критерия, один из которых связан с самой поздней датой, а другой - только с текущей записью, это должно работать. У меня нет данных для тестирования, поэтому он не был проверен:

SELECT 
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number
FROM
    dbo.CaseStages INNER JOIN
    dbo.CaseMaster ON dbo.CaseStages.case_id = dbo.CaseMaster.id
WHERE
    ( dbo.CaseStages.stage_status = 'In Progress' )

UNION ALL

SELECT stage_name, stage_case_no,case_type,company_role,stage_start_date,stage_status,case_id,file_number
FROM 
(SELECT
    MAX(dbo.CaseStages.stage_end_date) EndDate, 
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number
FROM
    dbo.CaseStages INNER JOIN
    dbo.CaseMaster ON dbo.CaseStages.case_id = dbo.CaseMaster.id
WHERE  
     dbo.CaseStages.stage_status = 'Adjudicated'
GROUP BY dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no,
    dbo.CaseStages.case_type,
    dbo.CaseStages.company_role,
    dbo.CaseStages.stage_start_date,
    dbo.CaseStages.stage_status, 
    dbo.CaseStages.case_id,
    dbo.CaseMaster.file_number)
0 голосов
/ 16 октября 2019

Попробуйте,

SELECT TOP (100) PERCENT 
    dbo.CaseStages.stage_name,
    dbo.CaseStages.stage_case_no, 
    dbo.CaseStages.case_type, 
    dbo.CaseStages.company_role, 
    dbo.CaseStages.stage_start_date, 
    dbo.CaseStages.stage_status, 
    dbo.CaseMaster.file_number
FROM
(
    select 
        A.stage_name,
        A.stage_case_no, 
        A.case_type, 
        A.company_role, 
        A.stage_start_date, 
        A.stage_status, 
        A.file_number 
    FROM dbo.CaseStages A
    where dbo.CaseStages.stage_status = 'In Progress'
    union all
    select 
        A.stage_name,
        A.stage_case_no, 
        A.case_type, 
        A.company_role, 
        A.stage_start_date, 
        A.stage_status, 
        A.file_number
    from dbo.CaseStages A
    left join 
    (
        select distinct case_id 
        from dbo.CaseStages b 
        where b.stage_status = 'In Progress'
    )B
    on a.case_id=b.case_id
    where a.stage_status = 'Adjudicated'
    and b.case_id is null
)A
INNER JOIN dbo.CaseMaster 
ON A.case_id = dbo.CaseMaster.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...