Advertisement
Guest User

sincopuntouno

a guest
Nov 11th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.48 KB | None | 0 0
  1. /*Daily Sheet per provider to track income,new patients, and ortho procedures. Includes per day totals.*/
  2.  
  3. SET @FromDate = '2019-05-01', @ToDate = '2019-05-11'; /*Enter dates between the '' in YYYY-MM-DD format*/
  4. SET @Clinic = '%%';
  5.  
  6.  
  7.  
  8.  
  9. /*-- DO NOT MODIFY BELOW THIS LINE ---------------------------------------------------------*/
  10. /*Query code written/modifed 09/07/2018 by SalinaK*/
  11. /*
  12. 1 row per:
  13. - Day
  14. - Provider
  15. - Clinic
  16. --- per day total row of all providers
  17.  
  18. Columns:
  19. - Clinic = Clinic name for the appropriate clinic on each metric
  20. - Date = Date of the payment/completed procedure
  21. - Provider Abbreviation = Abbreviation of the provider on the procedure completed/payment made
  22. - Daily Adj Production = Daily net production (sum of procedure fees for procs completed in the date range + adjustments made in the date range - writeoffs made in the date range) [clinic based on procedure clinic]
  23. - PatPayNoPlan = Sum of patient payments made in the date range not attached to payment plans [clinic based on payment clinic]
  24. - PayPayPlan = Sum of patient payments made in the date range attached to payment plans [clinic based on payment clinic]
  25. - InsPay = Insurance payments made in the date range [clinic based on payment clinic]
  26. - NewPayPlans = Sum of payment plan principle and interest charges on payment plans created in the date range [clinic based on payplancharge clinic]
  27. - Bonds = Count of D8080 and D8090 completed in the date range [clinic based on procedure clinic]
  28. - OrthoAdj = Count of D8670 completed in the date range per provider [clinic based on procedure clinic]
  29. - Prophy = Count of completed D1110 and D1120 completed in the date range per provider [clinic based on procedure clinic]
  30. - SRP = Count of completed D4341 and D4342 completed in the date range per provider [clinic based on procedure clinic]
  31. - Filling = Count of completed D2110-D2430 completed in the date range per provider [clinic based on procedure clinic]
  32. - Crowns = Count of completed D2710-D2799 completed in the date range per provider [clinic based on procedure clinic]
  33. - NewPatients = Count of patients with any procedure that is not a broken appointment code completed in the date range (same as existing) [clinic based on procedure clinic]
  34. - SameDayStart = Count of patients with completed procedures that are outside the "Exams and Xrays" category on the same day as the New Patient appointment* [clinic based on procedure clinic]
  35. - PaymentNoStart = Count of patients who made a payment on the same day as their first ever completed appointment but did not complete any procedures outside of "Exam and Xrays" category codes on that day [clinic and provider based on procedures - One patient can count towards multiple providers if there are multiple procedures with more than one provider involved] (same as existing)
  36. - OrthoContracts = Count of D8080C and D8090C completed in the date range [clinic based on procedure clinic]
  37. - Chair Time = Sum of the difference of Time Seated and Time Dismissed [clinic based on appointment clinic]
  38. - Avg Chair Time = (Sum of the difference of Time Seated and Time Dismissed)/(total count of completed appointments) [clinic based on appointment clinic]
  39. - Avg Wait Time = Average of wait times for the day(Sum of wait times[difference between time arrived and time seated]/total count of completed appointments) [clinic based on appointment clinic]
  40.  
  41. User specified:
  42. - Date range
  43. - Clinic = Clinic abbreviation
  44.  
  45. Row shows on report if:
  46. - Criteria matches for day/provider, if no data display '0', even if provider has all 0's still show
  47. - Only not hidden providers
  48.  
  49. Notes: *New Patient Appointment defined as the date of their first completed procedure
  50. */
  51. #
  52. SET @Fillings = '^D2[1-4][1-9][0-9]'; -- Get all procedure codes D2110 - D2430
  53. #
  54. SET @NotFillings = '^D24[3-9][1-9]'; -- Remove all procedure codes D2431 - D2439
  55. #
  56. SET @i = -1, @i2 = -1; -- To get every date
  57.  
  58. SELECT results.Clinic,
  59. results.Date,
  60. results.Provider,
  61. FORMAT(SUM(results.DailyAdjProd),2) AS DailyAdjProd,
  62. FORMAT(SUM(results.PatPayNoPlan),2) AS PatPayNoPlan,
  63. FORMAT(SUM(results.PatPayPlan),2) AS PatPayPlan,
  64. FORMAT(SUM(results.InsPay),2) AS InsPay,
  65. FORMAT(SUM(results.NewPayPlans),2) AS NewPayPlans,
  66. SUM(results.OrthoContracts) AS OrthoContracts,
  67. SUM(results.NewPatients) AS NewPatients,
  68. SUM(results.Bonds) AS Bonds,
  69. SUM(results.OrthoAdj) AS OrthoAdj,
  70. SUM(results.SameDayStart) AS SameDayStart,
  71. SUM(results.Prophy) AS Prophy,
  72. SUM(results.SRP) AS SRP,
  73. SUM(results.Fillings) AS Fillings,
  74. SUM(results.Crowns) AS Crowns,
  75. SUM(results.PaymentNoStart) AS PaymentNoStart,
  76. SEC_TO_TIME(SUM(TIME_TO_SEC(results.ChairTime))) AS ChairTime,
  77. SEC_TO_TIME(SUM(TIME_TO_SEC(results.AvgChairTime))) AS AvgChairTime,
  78. SEC_TO_TIME(SUM(TIME_TO_SEC(results.AvgWaitTime))) AS AvgWaitTime
  79. FROM (
  80. SELECT
  81. c1.Clinic AS Clinic,
  82. 1 AS ItemOrder,
  83. DATE_FORMAT(dates.EveryDate,'%m/%d/%Y') AS 'Date',
  84. pr1.Abbr AS Provider,
  85. COALESCE(TransO.DailyAdjProd_,0.00) AS 'DailyAdjProd',
  86. COALESCE(TransO.PatPayNoPlan_,0.00) AS 'PatPayNoPlan',
  87. COALESCE(TransO.PatPayPlan_,0.00) AS 'PatPayPlan',
  88. COALESCE(TransO.InsPay_,0.00) AS 'InsPay',
  89. COALESCE(NewPayPlan.TotalAmt,0.00) AS 'NewPayPlans',
  90. COALESCE(TransO.Bonds,0) AS 'Bonds',
  91. COALESCE(TransO.OrthoAdj,0) AS 'OrthoAdj',
  92. COALESCE(TransO.Prophy,0) AS 'Prophy',
  93. COALESCE(TransO.SRP,0) AS 'SRP',
  94. COALESCE(TransO.Filling,0) AS 'Fillings',
  95. COALESCE(TransO.Crowns,0) AS 'Crowns',
  96. COALESCE(patinfo.NewPats,0) AS 'NewPatients',
  97. COALESCE(patinfo.SameDayStart,0) AS 'SameDayStart',
  98. COALESCE(patinfo.PaymentNoStart,0) AS 'PaymentNoStart',
  99. COALESCE(TransO.Contracts,0) AS 'OrthoContracts',
  100. aptTimeStats.ChairTime AS 'ChairTime',
  101. aptTimeStats.AvgChairTime AS 'AvgChairTime',
  102. aptTimeStats.AvgWaitTime AS 'AvgWaitTime'
  103. FROM (
  104. SELECT
  105. DATE(ADDDATE(@FromDate, INTERVAL @i := @i + 1 DAY)) AS EveryDate
  106. FROM (
  107. /*Dynamic table of numbers 1 to 1000*/
  108. SELECT nums.num
  109. FROM (
  110. SELECT CONCAT(n0.num,n1.num,n2.num) + 1 AS 'num' /*Convert it from separate numbers to a string and then to a single number, +0 if you want to start at 0*/
  111. /*0 to 9*/
  112. FROM (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n0
  113. /*10 to 99*/
  114. JOIN (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n1
  115. /*100 to 999*/
  116. JOIN (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n2
  117. ORDER BY num
  118. ) nums
  119. ) days
  120. HAVING @i < DATEDIFF(@ToDate, @FromDate)
  121. ) dates
  122. INNER JOIN (
  123. SELECT prov.ProvNum, prov.Abbr
  124. FROM provider prov
  125. WHERE prov.IsHidden = FALSE
  126. ) pr1
  127. ON TRUE
  128. INNER JOIN (
  129. SELECT clinic.ClinicNum, clinic.Description AS Clinic
  130. FROM clinic
  131.  
  132. UNION ALL
  133.  
  134. SELECT 0 AS ClinicNum, 'Unassigned' AS Clinic
  135. ) c1
  136. ON TRUE
  137. LEFT JOIN (
  138. /*Core calculations for daily adjusted production, patient payments (both attached to and not attached to payment plans), and ins payments.*/
  139. /*Also includes count of specified codes (SRP, Prophy, Fillings, Crowns, Ortho Contracts, and Bonds)*/
  140. SELECT
  141. Trans.ProvNum,
  142. Trans.TransDate AS 'Date',
  143. IFNULL(Trans.ClinicNum,0) AS 'ClinicNum',
  144. IFNULL(SUM(CASE
  145. WHEN Trans.TranType IN ('Prod','Adj') -- Production + adjustments
  146. THEN Trans.TranAmount - (CASE WHEN Trans.TranType='Writeoff' THEN Trans.TranAmount ELSE 0 END) -- If there is a writeoff, subtract it from the production amount (being Production + adjustments)
  147. ELSE 0
  148. END),0) AS DailyAdjProd_,
  149. IFNULL(SUM(CASE
  150. WHEN Trans.TranType = 'PatPayPlan' AND Trans.IsPayPlan = 0 -- When the patient does NOT have a payment plan
  151. THEN Trans.TranAmount
  152. ELSE 0
  153. END),0) AS PatPayNoPlan_,
  154. IFNULL(SUM(CASE
  155. WHEN Trans.TranType = 'PatPayPlan' AND Trans.IsPayPlan = 1 -- When the patient DOES have a payment plan
  156. THEN Trans.TranAmount
  157. ELSE 0
  158. END),0) AS PatPayPlan_,
  159. IFNULL(SUM(CASE
  160. WHEN Trans.TranType = 'InsPay' -- When there is an insurance payment
  161. THEN Trans.TranAmount
  162. ELSE 0
  163. END),0) AS InsPay_,
  164. IFNULL(SUM(Trans.Prophy),0) AS Prophy, -- count of prophy codes completed in the date range
  165. IFNULL(SUM(Trans.SRP),0) AS SRP, -- count of SRPs completed in the date range
  166. IFNULL(SUM(Trans.Filling),0) AS Filling, -- count of fillings completed in the date range
  167. IFNULL(SUM(Trans.Crowns),0) AS Crowns, -- count of crowns completed in the date range
  168. IFNULL(SUM(Trans.Contracts),0) AS Contracts, -- count of ortho contracts completed in the date range (determined by codes D8080C and D8090C)
  169. IFNULL(SUM(Trans.Bonds),0) AS Bonds, -- count of ortho bond codes completed in the date range
  170. IFNULL(SUM(Trans.OrthoAdj),0) AS OrthoAdj -- count of ortho adjustment codes compelted in the date range
  171. FROM (
  172. /*Trans table 1 row per transaction*/
  173. /*Prod - Return proc info for specific procs completed in the date range*/
  174. SELECT 'Prod' AS TranType,
  175. pl.ProcDate AS TransDate,
  176. pl.ProvNum,
  177. pl.ProcFee * (pl.UnitQty + pl.BaseUnits) - IFNULL(SUM(cp.WriteOff),0) AS TranAmount,
  178. 0 AS IsPayPlan,
  179. pl.ClinicNum,
  180. (CASE WHEN pc.ProcCode IN ('D1110','D1120') THEN 1 ELSE 0 END) AS Prophy,
  181. (CASE WHEN pc.ProcCode IN ('D4341','D4342') THEN 1 ELSE 0 END) AS SRP,
  182. (CASE WHEN pc.ProcCode REGEXP @Fillings AND pc.ProcCode NOT REGEXP @NotFillings THEN 1 ELSE 0 END) AS Filling,
  183. (CASE WHEN pc.ProcCode LIKE 'D27%' AND pc.ProcCode NOT LIKE 'D270%' THEN 1 ELSE 0 END) AS Crowns,
  184. (CASE WHEN pc.ProcCode IN ('D8080C','D8090C') THEN 1 ELSE 0 END) AS Contracts,
  185. (CASE WHEN pc.ProcCode IN ('D8080', 'D8090') THEN 1 ELSE 0 END) AS Bonds,
  186. (CASE WHEN pc.ProcCode = 'D8670' THEN 1 ELSE 0 END) AS OrthoAdj
  187. FROM procedurelog pl
  188. LEFT JOIN clinic c
  189. ON c.ClinicNum = pl.ClinicNum
  190. INNER JOIN procedurecode pc
  191. ON pc.CodeNum = pl.CodeNum
  192. LEFT JOIN claimproc cp
  193. ON pl.ProcNum = cp.ProcNum
  194. AND cp.Status = '7' -- CapComplete
  195. WHERE pl.ProcStatus = 2 -- Complete
  196. AND pl.ProcDate BETWEEN @FromDate AND @ToDate
  197. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  198. GROUP BY pl.ProcNum
  199.  
  200. UNION ALL
  201.  
  202. /*Adj - Return adjs made in the date range*/
  203. SELECT 'Adj' AS TranType,
  204. a.AdjDate AS TransDate,
  205. a.ProvNum,
  206. a.AdjAmt AS TranAmount,
  207. 0 AS IsPayPlan,
  208. a.ClinicNum,
  209. 0 AS Prophy,
  210. 0 AS SRP,
  211. 0 AS Filling,
  212. 0 AS Crowns,
  213. 0 AS Contracts,
  214. 0 AS Bonds,
  215. 0 AS OrthoAdj
  216. FROM adjustment a
  217. LEFT JOIN clinic c
  218. ON c.ClinicNum = a.ClinicNum
  219. WHERE a.AdjDate BETWEEN @FromDate AND @ToDate
  220. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  221.  
  222. UNION ALL
  223.  
  224. /*Patient payments - returns paysplit trans created in the date range*/
  225. SELECT 'PatPayPlan' AS TranType,
  226. ps.DatePay AS TransDate,
  227. ps.ProvNum,
  228. ps.SplitAmt AS TranAmount,
  229. (CASE WHEN ps.PayPlanNum = 0 THEN 0 ELSE 1 END) AS IsPayPlan,
  230. ps.ClinicNum,
  231. 0 AS Prophy,
  232. 0 AS SRP,
  233. 0 AS Filling,
  234. 0 AS Crowns,
  235. 0 AS Contracts,
  236. 0 AS Bonds,
  237. 0 AS OrthoAdj
  238. FROM paysplit ps
  239. LEFT JOIN clinic c
  240. ON c.ClinicNum = ps.ClinicNum
  241. WHERE ps.DatePay BETWEEN @FromDate AND @ToDate
  242. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  243. AND ps.ProvNum != 0 -- No Prepayments
  244.  
  245. UNION ALL
  246.  
  247. /*InsIncome*/
  248. SELECT 'InsPay' AS TranType,
  249. cp.DateCP AS TransDate,
  250. cp.ProvNum,
  251. cp.InsPayAmt AS TranAmount,
  252. 0 AS IsPayPlan,
  253. cp.ClinicNum,
  254. 0 AS Prophy,
  255. 0 AS SRP,
  256. 0 AS Filling,
  257. 0 AS Crowns,
  258. 0 AS Contracts,
  259. 0 AS Bonds,
  260. 0 AS OrthoAdj
  261. FROM claimproc cp
  262. LEFT JOIN clinic c
  263. ON c.ClinicNum = cp.ClinicNum
  264. WHERE cp.DateCP BETWEEN @FromDate AND @ToDate
  265. AND cp.Status IN (1,4) -- Received, Supplemental
  266. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  267.  
  268. UNION ALL
  269.  
  270. /*Writeoff*/
  271. SELECT 'Writeoff' AS TranType,
  272. cp.ProcDate AS TransDate,
  273. cp.ProvNum,
  274. -cp.WriteOff AS TranAmount,
  275. 0 AS IsPayPlan,
  276. cp.ClinicNum,
  277. 0 AS Prophy,
  278. 0 AS SRP,
  279. 0 AS Filling,
  280. 0 AS Crowns,
  281. 0 AS Contracts,
  282. 0 AS Bonds,
  283. 0 AS OrthoAdj
  284. FROM claimproc cp
  285. LEFT JOIN clinic c
  286. ON c.ClinicNum = cp.ClinicNum
  287. WHERE cp.DateCP BETWEEN @FromDate AND @ToDate
  288. AND cp.Status IN (1,4) -- Received, Supplemental
  289. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  290. ) Trans
  291. GROUP BY Trans.TransDate, Trans.ProvNum, Trans.ClinicNum
  292. ) TransO
  293. ON TransO.ProvNum = pr1.provNum
  294. AND TransO.ClinicNum = c1.ClinicNum
  295. AND TransO.Date = dates.EveryDate
  296. LEFT JOIN (
  297. /*Return appt time per prov/clinic for the trans dates in transo*/
  298. SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeDismissed, a.DateTimeSeated)))) AS ChairTime,
  299. SEC_TO_TIME((SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeDismissed, a.DateTimeSeated))))/COUNT((CASE WHEN a.AptStatus = 2 THEN a.AptNum END))) AS AvgChairTime,
  300. SEC_TO_TIME((SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeSeated, a.DateTimeArrived))))/COUNT((CASE WHEN a.AptStatus = 2 THEN a.AptNum END))) AS AvgWaitTime,
  301. IFNULL(c.ClinicNum,0) ClinicNum,
  302. a.ProvNum,
  303. DATE(a.AptDateTime) AS AptDate
  304. FROM appointment a
  305. LEFT JOIN clinic c
  306. ON c.ClinicNum = a.ClinicNum
  307. WHERE a.AptDateTime BETWEEN @FromDate AND @ToDate + INTERVAL 1 DAY
  308. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  309. GROUP BY DATE(a.AptDateTime), a.ProvNum, c.ClinicNum
  310. ) aptTimeStats
  311. ON aptTimeStats.ProvNum = pr1.ProvNum
  312. AND aptTimeStats.ClinicNum = c1.ClinicNum
  313. AND aptTimeStats.AptDate = dates.EveryDate
  314. LEFT JOIN (
  315. /*Return PayPlan totals for plans showing in the date range*/
  316. SELECT ppc.ProvNum,
  317. SUM(ppc.Principal + ppc.Interest) TotalAmt,
  318. pp.PayPlanDate,
  319. IFNULL(ppc.ClinicNum,0) AS 'ClinicNum'
  320. FROM payplancharge ppc
  321. INNER JOIN payplan pp
  322. ON pp.PayPlanNum = ppc.PayPlanNum
  323. LEFT JOIN clinic c
  324. ON c.ClinicNum = ppc.ClinicNum
  325. WHERE pp.PayPlanDate BETWEEN @FromDate AND @ToDate
  326. AND ppc.ChargeType = 0 -- Debit
  327. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  328. GROUP BY pp.PayPlanDate, ppc.ProvNum, ppc.ClinicNum
  329. ) NewPayPlan
  330. ON NewPayPlan.ProvNum = pr1.ProvNum
  331. AND NewPayPlan.ClinicNum = c1.ClinicNum
  332. AND NewPayPlan.PayPlanDate = dates.EveryDate
  333. LEFT JOIN (
  334. /*return patient and trans info for the provs trans dates in TransO table*/
  335. SELECT COUNT(CASE
  336. WHEN sameday.SameDayStart = 'NoStart'
  337. THEN NULL
  338. ELSE sameday.PatNum
  339. END) AS SameDayStart,
  340. IFNULL(sameday.ClinicNum,0) AS ClinicNum,
  341. COUNT(sameday.PatNum) AS NewPats,
  342. sameday.FirstVisit AS 'Date',
  343. sameday.ProvNum,
  344. COUNT(CASE
  345. WHEN SameDay.PaymentNoStart = 'NA'
  346. THEN NULL
  347. ELSE SameDay.PaymentNoStart
  348. END) AS PaymentNoStart
  349. FROM (
  350. /*Return 1 row for patients with first exam/xray completed date in date range*/
  351. SELECT
  352. SUBSTRING_INDEX(SUBSTRING_INDEX(firstvisit.DatesDrs,':',1),'|',-1) AS ProvNum,
  353. firstvisit.FirstVisit,
  354. firstvisit.PatNum,
  355. IFNULL((SELECT
  356. procedurelog.PatNum
  357. FROM procedurelog
  358. INNER JOIN procedurecode
  359. ON procedurecode.CodeNum = procedurelog.CodeNum
  360. AND procedurecode.ProcCode NOT IN ('D9987','D9986')
  361. INNER JOIN definition def
  362. ON def.DefNum = procedurecode.ProcCat
  363. AND def.Category = 11
  364. AND def.ItemName NOT LIKE '%Exams & Xrays%'
  365. LEFT JOIN clinic c
  366. ON c.ClinicNum = procedurelog.ClinicNum
  367. WHERE procedurelog.PatNum = firstvisit.PatNum
  368. AND procedurelog.ProcDate = firstvisit.FirstVisit
  369. AND procedurelog.ProcStatus = 2 -- Complete
  370. AND procedurelog.ProcDate <= @ToDate
  371. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  372. GROUP BY procedurelog.PatNum
  373. ),'NoStart') SameDayStart,
  374. IFNULL((
  375. SELECT ps.PatNum
  376. FROM paysplit ps
  377. LEFT JOIN clinic c
  378. ON c.ClinicNum = ps.ClinicNum
  379. WHERE ps.PatNum = firstvisit.PatNum
  380. AND ps.DatePay = firstvisit.FirstVisit
  381. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  382. GROUP BY ps.PatNum
  383. HAVING SameDayStart = 'NoStart'
  384. ),'NA') AS PaymentNoStart,
  385. IFNULL(firstvisit.ClinicNum,0) AS 'ClinicNum'
  386. FROM (
  387. /*Return subset of first visit dates for patients with procs completed before the end of date range that are exams/xrays, and that fv date is in the date range */
  388. SELECT pl.PatNum,
  389. pl.ProvNum,
  390. GROUP_CONCAT(CONCAT(pl.ProcDate,'|',pl.ProvNum) ORDER BY pl.ProcDate ASC SEPARATOR ':') AS DatesDrs,
  391. MIN(pl.ProcDate) AS FirstVisit,
  392. c.ClinicNum
  393. FROM procedurelog pl
  394. INNER JOIN procedurecode pc
  395. ON pc.CodeNum = pl.CodeNum
  396. AND pc.ProcCode NOT IN ('D9987','D9986')
  397. INNER JOIN definition def
  398. ON def.DefNum = pc.ProcCat
  399. AND def.Category = 11 -- ProcCodeCats
  400. AND def.ItemName LIKE '%Exams & Xrays%'
  401. INNER JOIN provider
  402. ON provider.ProvNum = pl.ProvNum
  403. AND provider.IsSecondary = 0 -- only join providers, not hygienists
  404. LEFT JOIN clinic c
  405. ON c.ClinicNum = pl.ClinicNum
  406. WHERE pl.ProcStatus = 2 -- Complete
  407. AND pl.ProcDate <= @ToDate
  408. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  409. GROUP BY pl.PatNum
  410. HAVING MIN(pl.ProcDate) BETWEEN @FromDate AND @ToDate
  411. ) firstvisit
  412. GROUP BY firstvisit.PatNum
  413. ) SameDay
  414. GROUP BY sameday.FirstVisit, sameday.ProvNum, sameday.ClinicNum
  415. ) patinfo
  416. ON patinfo.ProvNum = pr1.ProvNum
  417. AND patinfo.ClinicNum = c1.ClinicNum
  418. AND patinfo.Date = dates.EveryDate
  419. GROUP BY dates.EveryDate, pr1.ProvNum, c1.ClinicNum
  420.  
  421. UNION ALL
  422.  
  423. /*Calculating totals per day*/
  424. SELECT
  425. '' AS Clinic,
  426. 2 AS ItemOrder,
  427. DATE_FORMAT(totdates.EveryDate,'%m/%d/%Y') AS 'Date',
  428. '--Total:' AS Provider,
  429. COALESCE(SUM(TransO.DailyAdjProd_),0) DailyAdjProd,
  430. COALESCE(SUM(TransO.PatPayNoPlan_),0) PatPayNoPlan,
  431. COALESCE(SUM(TransO.PatPayPlan_),0) PatPayPlan,
  432. COALESCE(SUM(TransO.InsPay_),0) InsPay,
  433. COALESCE(SUM(NewPayPlan.TotalAmt),0) NewPayPlans,
  434. COALESCE(SUM(TransO.Bonds),0) Bonds,
  435. COALESCE(SUM(TransO.OrthoAdj),0) OrthoAdj,
  436. COALESCE(SUM(TransO.Prophy),0) AS Prophy,
  437. COALESCE(SUM(TransO.SRP),0) AS SRP,
  438. COALESCE(SUM(TransO.Filling),0) AS Fillings,
  439. COALESCE(SUM(TransO.Crowns),0) AS Crowns,
  440. COALESCE(SUM(PatInfo.NewPats),0) NewPatients,
  441. COALESCE(SUM(PatInfo.SameDayStart),0) SameDayStart,
  442. COALESCE(SUM(patinfo.PaymentNoStart),0) PaymentNoStart,
  443. COALESCE(SUM(TransO.Contracts),0) OrthoContracts,
  444. SEC_TO_TIME(SUM(TIME_TO_SEC(aptTimeStats.ChairTime))) ChairTime,
  445. SEC_TO_TIME(SUM(TIME_TO_SEC(aptTimeStats.AvgChairTime))) AvgChairTime,
  446. SEC_TO_TIME(SUM(TIME_TO_SEC(aptTimeStats.AvgWaitTime))) AvgWaitTime
  447. FROM (
  448. SELECT
  449. DATE(ADDDATE(@FromDate, INTERVAL @i2 := @i2 + 1 DAY)) AS EveryDate
  450. FROM (
  451. /*Dynamic table of numbers 1 to 1000*/
  452. SELECT nums.num
  453. FROM (
  454. SELECT CONCAT(n0.num,n1.num,n2.num) + 1 AS 'num' /*Convert it from separate numbers to a string and then to a single number, +0 if you want to start at 0*/
  455. /*0 to 9*/
  456. FROM (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n0
  457. /*10 to 99*/
  458. JOIN (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n1
  459. /*100 to 999*/
  460. JOIN (SELECT 1 AS 'num' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS n2
  461. ORDER BY num
  462. ) nums
  463. ) days
  464. HAVING @i2 < DATEDIFF(@ToDate, @FromDate)
  465. ) totdates
  466. LEFT JOIN (
  467. /*Core calculations for daily adjusted production, patient payments (both attached to and not attached to payment plans), and ins payments.*/
  468. /*Also includes count of specified codes (SRP, Prophy, Fillings, Crowns, Ortho Contracts, and Bonds)*/
  469. SELECT
  470. Trans.ProvNum,
  471. Trans.TransDate,
  472. Trans.ClinicNum,
  473. SUM(CASE
  474. WHEN Trans.TranType IN ('Prod','Adj') -- Production + adjustments
  475. THEN Trans.TranAmount - (CASE WHEN Trans.TranType='Writeoff' THEN Trans.TranAmount ELSE 0 END) -- If there is a writeoff, subtract it from the production amount (being Production + adjustments)
  476. ELSE 0
  477. END) AS DailyAdjProd_,
  478. SUM(CASE
  479. WHEN Trans.TranType = 'PatPayPlan' AND Trans.IsPayPlan = 0 -- When the patient does NOT have a payment plan
  480. THEN Trans.TranAmount
  481. ELSE 0
  482. END) AS PatPayNoPlan_,
  483. SUM(CASE
  484. WHEN Trans.TranType = 'PatPayPlan' AND Trans.IsPayPlan = 1 -- When the patient DOES have a payment plan
  485. THEN Trans.TranAmount
  486. ELSE 0
  487. END) AS PatPayPlan_,
  488. SUM(CASE
  489. WHEN Trans.TranType = 'InsPay' -- When there is an insurance payment
  490. THEN Trans.TranAmount
  491. ELSE 0
  492. END) AS InsPay_,
  493. SUM(Trans.Prophy) AS Prophy,
  494. SUM(Trans.SRP) AS SRP,
  495. SUM(Trans.Filling) AS Filling,
  496. SUM(Trans.Crowns) AS Crowns,
  497. SUM(Trans.Contracts) AS Contracts,
  498. SUM(Trans.Bonds) AS Bonds,
  499. SUM(Trans.OrthoAdj) AS OrthoAdj
  500. FROM (
  501. /*Trans table 1 row per transaction*/
  502. /*Prod - Return proc info for specific procs completed in the date range*/
  503. SELECT 'Prod' AS TranType,
  504. pl.ProcDate AS TransDate,
  505. pl.ProvNum,
  506. pl.ProcFee * (pl.UnitQty + pl.BaseUnits) - IFNULL(SUM(cp.WriteOff),0) AS TranAmount,
  507. 0 AS IsPayPlan,
  508. pl.ClinicNum,
  509. (CASE WHEN pc.ProcCode IN ('D1110','D1120') THEN 1 ELSE 0 END) AS Prophy,
  510. (CASE WHEN pc.ProcCode IN ('D4341','D4342') THEN 1 ELSE 0 END) AS SRP,
  511. (CASE WHEN pc.ProcCode REGEXP @Fillings AND pc.ProcCode NOT REGEXP @NotFillings THEN 1 ELSE 0 END) AS Filling,
  512. (CASE WHEN pc.ProcCode LIKE 'D27%' AND pc.ProcCode NOT LIKE 'D270%' THEN 1 ELSE 0 END) AS Crowns,
  513. (CASE WHEN pc.ProcCode IN ('D8080C','D8090C') THEN 1 ELSE 0 END) AS Contracts,
  514. (CASE WHEN pc.ProcCode IN ('D8080', 'D8090') THEN 1 ELSE 0 END) AS Bonds,
  515. (CASE WHEN pc.ProcCode = 'D8670' THEN 1 ELSE 0 END) AS OrthoAdj
  516. FROM procedurelog pl
  517. LEFT JOIN clinic c
  518. ON c.ClinicNum = pl.ClinicNum
  519. INNER JOIN procedurecode pc
  520. ON pc.CodeNum = pl.CodeNum
  521. LEFT JOIN claimproc cp
  522. ON pl.ProcNum = cp.ProcNum
  523. AND cp.Status = '7' -- CapComplete
  524. WHERE pl.ProcStatus = 2 -- Complete
  525. AND pl.ProcDate BETWEEN @FromDate AND @ToDate
  526. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  527. GROUP BY pl.ProcNum
  528.  
  529. UNION ALL
  530.  
  531. /*Adj - Return adjs made in the date range*/
  532. SELECT 'Adj' AS TranType,
  533. a.AdjDate AS TransDate,
  534. a.ProvNum,
  535. a.AdjAmt AS TranAmount,
  536. 0 AS IsPayPlan,
  537. a.ClinicNum,
  538. 0 AS Prophy,
  539. 0 AS SRP,
  540. 0 AS Filling,
  541. 0 AS Crowns,
  542. 0 AS Contracts,
  543. 0 AS Bonds,
  544. 0 AS OrthoAdj
  545. FROM adjustment a
  546. LEFT JOIN clinic c
  547. ON c.ClinicNum = a.ClinicNum
  548. WHERE a.AdjDate BETWEEN @FromDate AND @ToDate
  549. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  550.  
  551. UNION ALL
  552.  
  553. /*Patient payments - returns paysplit trans created in the date range*/
  554. SELECT 'PatPayPlan' AS TranType,
  555. ps.DatePay AS TransDate,
  556. ps.ProvNum,
  557. ps.SplitAmt AS TranAmount,
  558. (CASE WHEN ps.PayPlanNum = 0 THEN 0 ELSE 1 END) AS IsPayPlan,
  559. ps.ClinicNum,
  560. 0 AS Prophy,
  561. 0 AS SRP,
  562. 0 AS Filling,
  563. 0 AS Crowns,
  564. 0 AS Contracts,
  565. 0 AS Bonds,
  566. 0 AS OrthoAdj
  567. FROM paysplit ps
  568. LEFT JOIN clinic c
  569. ON c.ClinicNum = ps.ClinicNum
  570. WHERE ps.DatePay BETWEEN @FromDate AND @ToDate
  571. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  572. AND ps.ProvNum != 0 -- No prepayments
  573.  
  574. UNION ALL
  575.  
  576. /*InsIncome*/
  577. SELECT 'InsPay' AS TranType,
  578. cp.DateCP AS TransDate,
  579. cp.ProvNum,
  580. cp.InsPayAmt AS TranAmount,
  581. 0 AS IsPayPlan,
  582. cp.ClinicNum,
  583. 0 AS Prophy,
  584. 0 AS SRP,
  585. 0 AS Filling,
  586. 0 AS Crowns,
  587. 0 AS Contracts,
  588. 0 AS Bonds,
  589. 0 AS OrthoAdj
  590. FROM claimproc cp
  591. LEFT JOIN clinic c
  592. ON c.ClinicNum = cp.ClinicNum
  593. WHERE cp.DateCP BETWEEN @FromDate AND @ToDate
  594. AND cp.Status IN (1,4) -- Received, Supplemental
  595. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  596.  
  597. UNION ALL
  598.  
  599. /*Writeoff*/
  600. SELECT 'Writeoff' AS TranType,
  601. cp.ProcDate AS TransDate,
  602. cp.ProvNum,
  603. -cp.WriteOff AS TranAmount,
  604. 0 AS IsPayPlan,
  605. cp.ClinicNum,
  606. 0 AS Prophy,
  607. 0 AS SRP,
  608. 0 AS Filling,
  609. 0 AS Crowns,
  610. 0 AS Contracts,
  611. 0 AS Bonds,
  612. 0 AS OrthoAdj
  613. FROM claimproc cp
  614. LEFT JOIN clinic c
  615. ON c.ClinicNum = cp.ClinicNum
  616. WHERE cp.DateCP BETWEEN @FromDate AND @ToDate
  617. AND cp.Status IN (1,4) -- Received, Supplemental
  618. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  619. ) Trans
  620. GROUP BY Trans.TransDate
  621. ) TransO
  622. ON TransO.TransDate = totdates.EveryDate
  623. LEFT JOIN (
  624. /*Return appt time per prov/clinic for the trans dates in transo*/
  625. SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeDismissed, a.DateTimeSeated)))) AS ChairTime,
  626. SEC_TO_TIME((SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeDismissed, a.DateTimeSeated))))/COUNT((CASE WHEN a.AptStatus = 2 THEN a.AptNum END))) AS AvgChairTime,
  627. SEC_TO_TIME((SUM(TIME_TO_SEC(TIMEDIFF(a.DateTimeSeated, a.DateTimeArrived))))/COUNT((CASE WHEN a.AptStatus = 2 THEN a.AptNum END))) AS AvgWaitTime,
  628. IFNULL(c.ClinicNum,0) ClinicNum,
  629. a.ProvNum,
  630. DATE(a.AptDateTime) AS AptDate
  631. FROM appointment a
  632. LEFT JOIN clinic c ON c.ClinicNum = a.ClinicNum
  633. WHERE a.AptDateTime BETWEEN @FromDate AND @ToDate + INTERVAL 1 DAY
  634. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  635. GROUP BY DATE(a.AptDateTime)
  636. ) aptTimeStats
  637. ON aptTimeStats.AptDate = totdates.EveryDate
  638. LEFT JOIN (
  639. /*Return PayPlan totals for plans showing in the date range*/
  640. SELECT ppc.ProvNum,
  641. SUM(ppc.Principal + ppc.Interest) TotalAmt,
  642. pp.PayPlanDate,
  643. ppc.ClinicNum
  644. FROM payplancharge ppc
  645. INNER JOIN payplan pp
  646. ON pp.PayPlanNum = ppc.PayPlanNum
  647. LEFT JOIN clinic c
  648. ON c.ClinicNum = ppc.ClinicNum
  649. WHERE pp.PayPlanDate BETWEEN @FromDate AND @ToDate
  650. AND ppc.ChargeType = 0 -- Debit
  651. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  652. GROUP BY pp.PayPlanDate
  653. ) NewPayPlan
  654. ON NewPayPlan.PayPlanDate = totdates.EveryDate
  655. LEFT JOIN (
  656. /*return patient and trans info for the provs trans dates in TransO table*/
  657. SELECT COUNT(CASE
  658. WHEN sameday.SameDayStart = 'NoStart'
  659. THEN NULL
  660. ELSE sameday.PatNum
  661. END) SameDayStart,
  662. IFNULL(sameday.ClinicNum,0) AS ClinicNum,
  663. COUNT(sameday.PatNum) AS NewPats,
  664. sameday.FirstVisit AS 'Date',
  665. sameday.ProvNum,
  666. COUNT(SameDay.PaymentNoStart) AS PaymentNoStart
  667. FROM (
  668. /*Return 1 row for patients with first exam/xray completed date in date range*/
  669. SELECT
  670. SUBSTRING_INDEX(SUBSTRING_INDEX(firstvisit.DatesDrs,':',1),'|',-1) AS ProvNum,
  671. firstvisit.FirstVisit,
  672. firstvisit.PatNum,
  673. IFNULL((SELECT
  674. procedurelog.PatNum
  675. FROM procedurelog
  676. INNER JOIN procedurecode
  677. ON procedurecode.CodeNum = procedurelog.CodeNum
  678. AND procedurecode.ProcCode NOT IN ('D9987','D9986')
  679. INNER JOIN definition def
  680. ON def.DefNum = procedurecode.ProcCat
  681. AND def.Category = 11
  682. AND def.ItemName NOT LIKE '%Exams & Xrays%'
  683. LEFT JOIN clinic c
  684. ON c.ClinicNum = procedurelog.ClinicNum
  685. WHERE procedurelog.PatNum = firstvisit.PatNum
  686. AND procedurelog.ProcDate = firstvisit.FirstVisit
  687. AND procedurelog.ProcStatus = 2 -- Complete
  688. AND procedurelog.ProcDate <= @ToDate
  689. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  690. GROUP BY procedurelog.PatNum
  691. ),'NoStart') SameDayStart,
  692. (
  693. SELECT ps.PatNum
  694. FROM paysplit ps
  695. LEFT JOIN clinic c
  696. ON c.ClinicNum = ps.ClinicNum
  697. WHERE ps.PatNum = firstvisit.PatNum
  698. AND ps.DatePay = firstvisit.FirstVisit
  699. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  700. GROUP BY ps.PatNum
  701. HAVING SameDayStart = 'NoStart'
  702. ) AS PaymentNoStart,
  703. firstvisit.ClinicNum
  704. FROM (
  705. /*Return subset of first visit dates for patients with procs completed before the end of date range that are exams/xrays, and that fv date is in the date range */
  706. SELECT pl.PatNum,
  707. pl.ProvNum,
  708. GROUP_CONCAT(CONCAT(pl.ProcDate,'|',pl.ProvNum) ORDER BY pl.ProcDate ASC SEPARATOR ':') AS DatesDrs,
  709. MIN(pl.ProcDate) AS FirstVisit,
  710. c.ClinicNum
  711. FROM procedurelog pl
  712. INNER JOIN procedurecode pc
  713. ON pc.CodeNum = pl.CodeNum
  714. AND pc.ProcCode NOT IN ('D9987','D9986')
  715. INNER JOIN definition def
  716. ON def.DefNum = pc.ProcCat
  717. AND def.Category = 11 -- ProcCodeCats
  718. AND def.ItemName LIKE '%Exams & Xrays%'
  719. INNER JOIN provider
  720. ON provider.ProvNum = pl.ProvNum
  721. AND provider.IsSecondary = 0 -- only join providers, not hygienists
  722. LEFT JOIN clinic c
  723. ON c.ClinicNum = pl.ClinicNum
  724. WHERE pl.ProcStatus = 2 -- Complete
  725. AND pl.ProcDate <= @ToDate
  726. AND (CASE WHEN @Clinic = '%%' THEN TRUE ELSE c.Description LIKE @Clinic END)
  727. GROUP BY pl.PatNum
  728. HAVING MIN(pl.ProcDate) BETWEEN @FromDate AND @ToDate
  729. ) firstvisit
  730. GROUP BY firstvisit.PatNum
  731. ) SameDay
  732. GROUP BY sameday.FirstVisit
  733. ) patinfo
  734. ON patinfo.Date = totdates.EveryDate
  735. GROUP BY totdates.EveryDate
  736. ) results
  737. GROUP BY results.Date, results.Provider, results.Clinic
  738. ORDER BY results.ItemOrder
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement