В SSRS как разделить группу рядов на две подгруппы - PullRequest
0 голосов
/ 21 апреля 2020

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

В данный момент в режиме разработки мой Tablix выглядит следующим образом:

enter image description here

... и мой график выглядит следующим образом :

enter image description here

Когда запрос выполняется, я получаю следующую таблицу и диаграмму (пока что все хорошо):

enter image description here

enter image description here

Что я хотел бы сделать, это разделить «Радикальную» серию на две (взаимоисключающие) подсерии «Category1» и «Category2» и отображают обе эти подсерии, «Radical» Series и «Palliative» и «Emergency» серии на одном графике, но я просто не могу найти простой способ

Базовое значение SQL стало довольно сложным, но важной его частью является следующее (в основном «Выражение1» относится к цели лечения, которая может быть как паллиативной, радикальной или задержкой, так и радикальное намерение может относиться либо к категории 1, либо к категории 2):

SELECT
        lut.Expression1,
        c.StartDateTime,
        p.PatientId, 
        p.LastName,
        d.DoctorId, 
        rh.TreatmentStartTime,
        CASE    
                --WHEN Expression1 like '%Cat1%' THEN 'Rad-Cat1'
                --WHEN Expression1 like '%Cat2%' THEN 'Rad-Cat2'
                WHEN Expression1 like '%Rad%' THEN 'Radical'
                WHEN Expression1 like '%Pall%' THEN 'Palliative'
                WHEN Expression1 = 'Emergency' THEN 'Emergency'

                --Charts filter out anything other than radical, palliative and emergency in post-processing, so include these.
                ELSE 'Other'
        END
        as 'IntentCategory',

        CASE WHEN Expression1 like '%Delay%' THEN 1 ELSE 0 END as 'Delayed',
        CASE WHEN 
        (
            (Expression1 like '%Rad%' AND datediff(dd, c.StartDateTime, FirstRadiationHstry.TreatmentStartTime) <= 28)  
            OR (Expression1 like '%Palliative%' AND datediff(dd, c.StartDateTime, FirstRadiationHstry.TreatmentStartTime) <= 14)
            OR (Expression1 = 'Emergency' AND datediff(dd, c.StartDateTime, FirstRadiationHstry.TreatmentStartTime) <= 1)
            --catch any exceptions
            OR ((Expression1 not like '%Rad%') AND (Expression1 not like '%Palliative%') AND (Expression1!='Emergency'))
        ) THEN 1 ELSE 0 END as 'TargetMet',
        FORMAT(rh.TreatmentStartTime,'yyyyMM') as 'TxStartSortDate',
        FirstRadiationHstry.TreatmentStartTime as 'MinTreatStart',
        datediff(dd, c.StartDateTime, rh.TreatmentStartTime) as 'TreatDelay',
        diag.DiagnosisCode,
        ROW_NUMBER() OVER (PARTITION BY p.PatientId, c.CourseId ORDER BY diag.DiagnosisTableName DESC, diag.DiagnosisCode) as rownum

    FROM
        dbo.Patient p
        inner join dbo.Course c on (c.PatientSer = p.PatientSer)
        inner join dbo.PatientDoctor pd on (pd.PatientSer = p.PatientSer)
        inner join dbo.Doctor d on (d.ResourceSer = pd.ResourceSer)
        inner join dbo.PhysicianIntent phi on (phi.CourseSer = c.CourseSer)
        inner join dbo.LookupTable lut on (lut.LookupValue = phi.TreatmentIntentType and lut.ListSelector = 'COURSE_INTENT')
        inner join dbo.CourseDiagnosis cd on (cd.CourseSer=c.CourseSer)
        inner join dbo.Diagnosis diag on (diag.DiagnosisSer=cd.DiagnosisSer)

        /*--Don't skip PlanSetup/Radiation for TreatmentRecord as may pick records not in clinical course*/
        inner join dbo.PlanSetup ps on (ps.CourseSer = c.CourseSer)
        inner join dbo.Radiation r on (r.PlanSetupSer = ps.PlanSetupSer)
        inner join dbo.RadiationHstry rh on (rh.RadiationSer = r.RadiationSer)

        /*-- Use a sub select to identify the first treatment record in the course,
        -- then check that the first treatment record in the date range corresponds to this record
        -- min() ensures we get the first record by date/time. Don't need to use fraction number/radiation number.
        -- but do need to use TreatmentDeliveryType to avoid Imaging (though what about day zeros?!)*/
        inner join (
                select distinct
                    min(rh_sub.TreatmentStartTime) over (partition by ps_sub.CourseSer) as 'TreatmentStartTime'
                    ,ps_sub.CourseSer
                from
                    dbo.RadiationHstry rh_sub 
                    inner join dbo.Radiation r_sub on (r_sub.RadiationSer = rh_sub.RadiationSer)
                    inner join dbo.PlanSetup ps_sub on (r_sub.PlanSetupSer = ps_sub.PlanSetupSer)   
                where
                    rh_sub.TreatmentDeliveryType like 'TREATMENT'
            ) as FirstRadiationHstry on (FirstRadiationHstry.CourseSer = c.CourseSer)

    WHERE 
        datediff(dd, @From, rh.TreatmentStartTime) >= 0
        and datediff(dd, rh.TreatmentStartTime, @To)>=0
        and d.OncologistFlag = 1
        and d.DoctorId in (@Doctors)
        and pd.PrimaryFlag = 1
        and lut.Expression1 in (@Intents)
        and lut.Expression1 not like 'Dummy Course'
        and rh.TreatmentStartTime = FirstRadiationHstry.TreatmentStartTime
        and diag.ObjectStatus='Active'
        and diag.DiagnosisTableName in(@DiagnosisTypes)
        and diag.DiagnosisCode in(@Diagnoses)

Я пытался использовать COALESCE в SQL, используя вложенные CASE-ы и переформатирование таблицы с дополнительными подколонками для подкатегорий, но ни одна из них, похоже, не работает. Возможно, вы могли бы объединить несколько наборов данных в одном графике? (хотя это не похоже на изящный метод). Должно быть легкое исправление - кто-то может показать мне?

С наилучшими пожеланиями

CJ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...