Я пытаюсь разделить данные из одного ряда в группе рядов на две отдельные подсерии и отобразить обе подсерии (вместе со всеми другими сериями в группе) в виде линий на диаграмме.
В данный момент в режиме разработки мой Tablix выглядит следующим образом:
... и мой график выглядит следующим образом :
Когда запрос выполняется, я получаю следующую таблицу и диаграмму (пока что все хорошо):
Что я хотел бы сделать, это разделить «Радикальную» серию на две (взаимоисключающие) подсерии «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