与值

时间:2015-07-22 16:02:07

标签: sql grouping

我尝试创建一个根据报告类型显示行数的报告。我在报告类型上进行分组,但有些报告类型在一个列表中包含了我想要的特定名称。

例如:Urgent Care报告的类型可以是Urgent CareSD494SD510SD546以及其他多种报告。我希望所有SD###都显示在Urgent Care下,而不是单独列出。与OP Notes相同,它们可以是OP NoteSD805polysomnography等。我希望那些位于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

以下是结果:(我已添加了一个编号栏,因此它不是段落形式)

  1. ASC Pre-OP Consult 1848.96 240.36
  2. 听力学报告4403.73 572.48
  3. Cardiac Cath 452.26 58.79
  4. Colon 539 Op Note 117.49 15.27
  5. 结肠镜检查 - OP Note 118.11 15.35
  6. 结肠镜检查 - Op Note 54.88 7.13
  7. 咨询3219.01 418.47
  8. CPAP Titration 1802.61 234.34
  9. 出院摘要5259.79 683.77
  10. EGD - Op Note 316.66 41.17
  11. EGD 537 Op Note 178.71 23.23
  12. EGD-Op Note 194.75 25.32
  13. 电生理学报告1679.79 218.37
  14. ER Admit 39402.45 5122.32
  15. ER格式150642.53 19583.53
  16. ERCP-Op Note 108.88 14.15
  17. 医院课程5344.91 694.84
  18. Multidisciplinary Oncology 272.38 35.41
  19. OP Note 32437.7 4216.9
  20. Op Note - SD698 57.66 7.5
  21. 疼痛诊所信32.71 4.25
  22. 疼痛诊所报告6.71 0.87
  23. 疼痛诊所SD1020 37.75 4.91
  24. PHP Discharge Summary 336.81 43.79
  25. PM住院患者咨询1602.96 208.38
  26. Polysomnography 2466.16 320.6
  27. Pre-OP Consult 30812.45 4005.62
  28. SD288初始伤害6398.55 831.81
  29. SD289跟进2893.45 376.15
  30. SD289后续行动2498.36 324.79
  31. SD488 OP Note 48.86 6.35
  32. SD496 - 紧急护理32.34 4.2
  33. SD503 - 紧急护理40.17 5.22
  34. SD504 - 紧急护理40.54 5.27
  35. SD509 - 紧急护理75.95 9.87
  36. SD541 - 紧急护理193.14 25.11
  37. SD594 - 紧急护理42.89 5.58
  38. SD606 - 紧急护理43.31 5.63
  39. 睡眠 - MSLT 85.53 11.12
  40. 睡眠信4505.21 585.68
  41. 睡眠报告25243.47 3281.65
  42. 演讲报告357.73 46.5
  43. STAT放电摘要1148.06 149.25
  44. 外科医院诊所注释1961.71 255.02
  45. 紧急护理30221.61 3928.81
  46. 紧急护理 - SD494 227.37 29.56
  47. 紧急护理 - SD496 37.17 4.83
  48. 紧急护理 - SD503 202.07 26.27
  49. 紧急护理 - SD504 117.74 15.31
  50. 紧急护理 - SD508 67.97 8.84
  51. 紧急护理 - SD509 60.1 7.81
  52. 紧急护理 - SD510 33.57 4.36
  53. 紧急护理 - SD541 47.4 6.16
  54. 紧急护理 - SD546 27.77 3.61
  55. 紧急护理 - SD594 40.17 5.22

1 个答案:

答案 0 :(得分:0)

在大多数数据库中(您没有指定自己的数据库),只需使用CASE语句按照您希望的方式对值进行分组,然后在您的两个数据库中使用相同的CASE语句SELECTGROUP 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%',其中也可能匹配SD5SD或{{}等模式1}}。如果这不是您想要的,那么请为您的数据库查找相应的正则表达式语句,并将其更改为该语句。