我尝试创建一个根据报告类型显示行数的报告。我在报告类型上进行分组,但有些报告类型在一个列表中包含了我想要的特定名称。
例如:Urgent Care
报告的类型可以是Urgent Care
,SD494
,SD510
,SD546
以及其他多种报告。我希望所有SD###
都显示在Urgent Care
下,而不是单独列出。与OP Notes
相同,它们可以是OP Note
,SD805
,polysomnography
等。我希望那些位于OP Notes
之下,但只能在一个报告中。我目前有大约20种不同的报告,我可以针对每种报告类型单独运行。
我该如何完成这项任务?
declare @officeID int = 93;
declare @startDate datetime = '6/01/2015';
declare @endDate datetime = '07/01/2015';
select (r.reporttype),
sum(cast(round(r.transcriptionlinecount,2) as decimal(8,2))) as "Bill Lines",
(cast(round(sum(r.transcriptionlinecount) * .13,2) as decimal(8,2))) as "Amount"
from rptlinecountinfo as r
join dictation as d on d.dictationID = r.dictationID
where
d.officeID = @officeID
and r.finishedtime between @startDate and @endDate
and (d.dictationStatus != 'D' and d.dictationStatus != 'Q')
group by r.reporttype
以下是结果:(我已添加了一个编号栏,因此它不是段落形式)
答案 0 :(得分:0)
在大多数数据库中(您没有指定自己的数据库),只需使用CASE
语句按照您希望的方式对值进行分组,然后在您的两个数据库中使用相同的CASE
语句SELECT
和GROUP BY
条款。
为了帮助您入门:
SELECT CASE WHEN r.reporttype LIKE 'SD%' THEN 'Urgent Care'
WHEN r.reporttype IN ('OP Note','SD805','polysomnography') THEN 'OP Notes'
ELSE r.reporttype END AS reporttype,
sum(cast(round(r.transcriptionlinecount,2) as decimal(8,2))) as "Bill Lines",
(cast(round(sum(r.transcriptionlinecount) * .13,2) as decimal(8,2))) as "Amount"
from rptlinecountinfo as r
join dictation as d on d.dictationID = r.dictationID
where
d.officeID = @officeID
and r.finishedtime between @startDate and @endDate
and (d.dictationStatus != 'D' and d.dictationStatus != 'Q')
group by CASE WHEN r.reporttype LIKE 'SD%' THEN 'Urgent Care'
WHEN r.reporttype IN ('OP Note','SD805','polysomnography') THEN 'OP Notes'
ELSE r.reporttype END
我应该警告你CASE
声明中的上述逻辑已经被打破了。原因是您的要求存在不一致。
一方面,您说应遵循此模式SD###
的所有报告类型都应映射到Urgent Care
。但是SD805
呢?您说您希望将其映射到OP Notes
,但根据您的规范,它也有效Urgent Care
。因此,在这种情况下,您必须确定您真正想要的是什么。如果您只有一个例外,那么您可能需要做的就是重新排序条件,以便首先检查例外情况。
另外,为了表示您的SD###
要求,我将其转换为非常标准的LIKE 'SD%'
,其中也可能匹配SD5
,SD
或{{}等模式1}}。如果这不是您想要的,那么请为您的数据库查找相应的正则表达式语句,并将其更改为该语句。