Hi,
I need to create an average across three calculated columns, where I have used CASE expressions to calculate each month's average days stay by clients in our facilities.
The CASE expression is somewhat convoluted because the database somehow puts a rubbish date into the pr.end_date field when the pr.open_stay box is ticked 'Y'. Don't ask me why, someone else built the application and the tables don't even have keys...
Anyway, the averages are correct (I have checked the raw data) but I don't know how to get it to average across the columns (which I know SQL can't do in a simple query, but there are ways and means...)
I have tried applying the answers from other queries but I can't seem to make them work in my query.
My query:
use [exoMashTrust-test]
declare @StartDate date , @EndDate date
,@StartDateMonth1 date, @StartDateMonth2 date, @StartDateMonth3 date
,@EndDateMonth1 date, @EndDateMonth2 date, @EndDateMonth3 date
,@TestDateStart date, @TestDateEnd date
,@NumberBeds int
,@LevelCode varchar(50)
---
set @StartDate = '20150101 00:00:00.000'
set @EndDate= '20150331 23:59:59.999'
set @StartDateMonth1 = '20150101 00:00:00.000'
set @EndDateMonth1= '20150131 23:59:59.999'
set @StartDateMonth2 = '20150201 00:00:00.000'
set @EndDateMonth2= '20150228 23:59:59.999'
set @StartDateMonth3 = '20150301 00:00:00.000'
set @EndDateMonth3= '20150331 23:59:59.999'
set @LevelCode = 'MHL2PN'
--Average Length of Stay for all 3 months
select
avg(case
WHEN PR.START_DATE < @StartDateMonth1 and pr.end_date < @StartDateMonth1
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth1
THEN null
when pr.start_date <= @StartDateMonth1 and pr.end_date <= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth1,pr.end_date)+1
when pr.start_date <= @StartDateMonth1 and pr.end_date >= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth1,@EndDateMonth1)+1
when pr.START_DATE <= @StartDateMonth1 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth1,@EndDateMonth1)+1
when pr.START_DATE >= @StartDateMonth1 and pr.end_date <= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth1 and pr.end_date >= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth1)+1
when pr.START_DATE >= @StartDateMonth1 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth1)+1
end) as [Month 1]
,avg(case
WHEN PR.START_DATE < @StartDateMonth2 and pr.end_date < @StartDateMonth2
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth2
THEN null
when pr.start_date <= @StartDateMonth2 and pr.end_date <= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth2,pr.end_date)+1
when pr.start_date <= @StartDateMonth2 and pr.end_date >= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth2,@EndDateMonth2)+1
when pr.START_DATE <= @StartDateMonth2 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth2,@EndDateMonth2)+1
when pr.START_DATE >= @StartDateMonth2 and pr.end_date <= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth2 and pr.end_date >= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth2)+1
when pr.START_DATE >= @StartDateMonth2 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth2)+1
end) as [Month2]
,avg(case
WHEN PR.START_DATE < @StartDateMonth3 and pr.end_date < @StartDateMonth3
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth3
THEN null
when pr.start_date <= @StartDateMonth3 and pr.end_date <= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth3,pr.end_date)+1
when pr.start_date <= @StartDateMonth3 and pr.end_date >= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth3,@EndDateMonth3)+1
when pr.START_DATE <= @StartDateMonth3 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth3,@EndDateMonth3)+1
when pr.START_DATE >= @StartDateMonth3 and pr.end_date <= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth3 and pr.end_date >= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth3)+1
when pr.START_DATE >= @StartDateMonth3 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth3)+1
end) as [Month3]
from
PATIENT_ROOMS as pr
join PATIENT_DETAILS as pd
on pr.PATIENT_ID=pd.PATIENT_ID
join PATIENT_ETH_TYPES as pet
on pd.ETHNICITY=pet.SEQNO
where
--Filter by Level
pr.STOCKCODE=@LevelCode
having
avg(case
WHEN PR.START_DATE < @StartDateMonth1 and pr.end_date < @StartDateMonth1
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth1
THEN null
when pr.start_date <= @StartDateMonth1 and pr.end_date <= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth1,pr.end_date)+1
when pr.start_date <= @StartDateMonth1 and pr.end_date >= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth1,@EndDateMonth1)+1
when pr.START_DATE <= @StartDateMonth1 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth1,@EndDateMonth1)+1
when pr.START_DATE >= @StartDateMonth1 and pr.end_date <= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth1 and pr.end_date >= @EndDateMonth1
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth1)+1
when pr.START_DATE >= @StartDateMonth1 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth1)+1
end) is not null
and avg(case
WHEN PR.START_DATE < @StartDateMonth2 and pr.end_date < @StartDateMonth2
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth2
THEN null
when pr.start_date <= @StartDateMonth2 and pr.end_date <= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth2,pr.end_date)+1
when pr.start_date <= @StartDateMonth2 and pr.end_date >= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth2,@EndDateMonth2)+1
when pr.START_DATE <= @StartDateMonth2 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth2,@EndDateMonth2)+1
when pr.START_DATE >= @StartDateMonth2 and pr.end_date <= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth2 and pr.end_date >= @EndDateMonth2
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth2)+1
when pr.START_DATE >= @StartDateMonth2 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth2)+1
end) is not null
and avg(case
WHEN PR.START_DATE < @StartDateMonth3 and pr.end_date < @StartDateMonth3
and pr.OPEN_STAY='N'
THEN null
when PR.START_DATE > @EndDateMonth3
THEN null
when pr.start_date <= @StartDateMonth3 and pr.end_date <= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth3,pr.end_date)+1
when pr.start_date <= @StartDateMonth3 and pr.end_date >= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,@StartDateMonth3,@EndDateMonth3)+1
when pr.START_DATE <= @StartDateMonth3 and pr.OPEN_STAY='Y'
then datediff(d,@StartDateMonth3,@EndDateMonth3)+1
when pr.START_DATE >= @StartDateMonth3 and pr.end_date <= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,pr.end_date)+1
when pr.START_DATE >= @StartDateMonth3 and pr.end_date >= @EndDateMonth3
and pr.OPEN_STAY='N'
then datediff(d,pr.START_DATE,@EndDateMonth3)+1
when pr.START_DATE >= @StartDateMonth3 and pr.OPEN_STAY='Y'
then datediff(d,pr.START_DATE,@EndDateMonth3)+1
end) is not null
;
This produces the following table:
Month 1 Month2 Month3
31 27 28
All I want is the average across these three months.
Thanks
Margo