按不同值分组

Group by unlike values

我正在尝试创建一个根据报告类型显示行数的报告。我正在按报告类型分组,但某些报告类型具有特定的名称,我想将它们组合在一个列表中。

例如: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 术前咨询 1848.96 240.36
  2. 听力报告 4403.73 572.48
  3. 心导管 452.26 58.79
  4. 冒号 539 操作注释 117.49 15.27
  5. 结肠镜检查 - 操作说明 118.11 15.35
  6. 结肠镜检查操作说明 54.88 7.13
  7. 咨询 3219.01 418.47
  8. CPAP 滴定 1802.61 234.34
  9. 出院总结 5259.79 683.77
  10. EGD - 操作说明 316.66 41.17
  11. EGD 537 操作说明 178.71 23.23
  12. EGD-操作说明 194.75 25.32
  13. 电生理报告 1679.79 218.37
  14. ER 录取 39402.45 5122.32
  15. ER 格式 150642.53 19583.53
  16. ERCP-操作说明 108.88 14.15
  17. 医院课程 5344.91 694.84
  18. 多学科肿瘤学 272.38 35.41
  19. OP 注释 32437.7 4216.9
  20. 操作说明 - SD698 57.66 7.5
  21. 疼痛门诊信 32.71 4.25
  22. 疼痛门诊报告 6.71 0.87
  23. 疼痛诊所 SD1020 37.75 4.91
  24. PHP 出院总结 336.81 43.79
  25. 下午住院咨询 1602.96 208.38
  26. 多导睡眠图 2466.16 320.6
  27. 术前咨询 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 注释 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

在大多数数据库中(你没有指定你的),只需使用 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 等模式,或者SDDFGDFG。如果这不是您想要的,请为您的数据库寻找合适的正则表达式语句,并将其更改为该语句。