$02.sql

  1. /**
  2.  * This query will build up the 3 temporary tables,
  3.  * and the runner will then query these tables.
  4.  */
  5.  
  6. -- Create all the temporary tables we need...
  7. CREATE TEMPORARY TABLE IF NOT EXISTS `nacl_crosstab_1` (
  8. `JOB_NO` VARCHAR(20) NOT NULL,
  9. `NACL_DATE` DATE,
  10. PRIMARY KEY (`JOB_NO`)
  11. );
  12.  
  13. CREATE TEMPORARY TABLE IF NOT EXISTS `nacl_crosstab_2` (
  14. `JOB_NO` VARCHAR(20) NOT NULL,
  15. `NACL_DATE` DATE,
  16. PRIMARY KEY (`JOB_NO`)
  17. );
  18.  
  19. CREATE TEMPORARY TABLE IF NOT EXISTS `nacl_crosstab_3` (
  20. `JOB_NO` VARCHAR(20) NOT NULL,
  21. `NACL_DATE` DATE,
  22. PRIMARY KEY (`JOB_NO`)
  23. );
  24.  
  25. -- Ensure they're empty before we insert.
  26. TRUNCATE TABLE `nacl_crosstab_1`;
  27. TRUNCATE TABLE `nacl_crosstab_2`;
  28. TRUNCATE TABLE `nacl_crosstab_3`;
  29.  
  30. -- Insert the data we want into these temp tables.
  31. INSERT INTO `nacl_crosstab_1` (`JOB_NO`, `NACL_DATE`)
  32. SELECT r.JOB_NO, MIN(l.`DATE`)
  33. FROM repairs r
  34. INNER JOIN nacllog l ON (l.`JOB_NO` = r.`JOB_NO`)
  35. WHERE (l.`REASON` = 'C')
  36. OR (l.`REASON` = '')
  37. OR (l.`REASON` IS NULL)
  38. GROUP BY r.`JOB_NO`;
  39.  
  40. INSERT INTO `nacl_crosstab_2` (`JOB_NO`, `NACL_DATE`)
  41. SELECT c.JOB_NO, MIN(l.`DATE`)
  42. FROM nacl_crosstab_1 c
  43. INNER JOIN nacllog l ON (l.`JOB_NO` = c.`JOB_NO`)
  44. AND (l.`DATE` > c.`NACL_DATE`)
  45. WHERE (l.`REASON` = 'C')
  46. OR (l.`REASON` = '')
  47. OR (l.`REASON` IS NULL)
  48. GROUP BY c.`JOB_NO`;
  49.  
  50. INSERT INTO `nacl_crosstab_3` (`JOB_NO`, `NACL_DATE`)
  51. SELECT c.JOB_NO, MIN(l.`DATE`)
  52. FROM nacl_crosstab_2 c
  53. INNER JOIN nacllog l ON (l.`JOB_NO` = c.`JOB_NO`)
  54. AND (l.`DATE` > c.`NACL_DATE`)
  55. WHERE (l.`REASON` = 'C')
  56. OR (l.`REASON` = '')
  57. OR (l.`REASON` IS NULL)
  58. c.`JOB_NO`;
  59.  
  60. -- Finally, get the results in a usable format.
  61. r.JOB_NO AS `CURRENT_JOB`,
  62. r.`COMP_DATE` AS `COMPLETED`,
  63. r.`HOUSE_KEY`,
  64. TRIM(h.`HOUSENO`) AS `HOUSENO`,
  65. h.`ROAD`,
  66. h.`DISTRICT`,
  67. h.`POSTCODE`,
  68. MAX(r2.`COMP_DATE`) AS `Latest Service`,
  69. DATE_FORMAT(MAX(v.`VISIT_END`), '%Y-%m-%d') AS `Last Visit`,
  70. MAX(n.`DATE`) AS `Last NACL`,
  71. n1.`NACL_DATE` AS `NACL_1`,
  72. n2.`NACL_DATE` AS `NACL_2`,
  73. n3.`NACL_DATE` AS `NACL_3`
  74. repairs r
  75. LEFT OUTER JOIN rep_visits v1 ON (v1.`JOB_NO` = r.`JOB_NO`)
  76. AND (v1.`VISIT_END` BETWEEN :startdate AND :stopdate)
  77. house h ON (h.`HOUSE_KEY` = r.`HOUSE_KEY`)
  78. repairs r2 ON (r2.`HOUSE_KEY` = r.`HOUSE_KEY`)
  79. AND (r2.`CALL_TYPE` = r.`CALL_TYPE`)
  80. AND (r2.`WORK_COMP` != 'X')
  81. rep_visits v ON (v.`JOB_NO` = r2.`JOB_NO`)
  82. `nacllog` n ON (n.`JOB_NO` = r.`JOB_NO`)
  83. `nacl_crosstab_1` n1 ON (n1.`JOB_NO` = r.`JOB_NO`)
  84. `nacl_crosstab_2` n2 ON (n2.`JOB_NO` = r.`JOB_NO`)
  85. `nacl_crosstab_3` n3 ON (n3.`JOB_NO` = r.`JOB_NO`)
  86. (r.`CALL_TYPE` = 'PM')
  87. AND (r.`WORK_COMP` != 'X')
  88. AND (
  89. (v1.`JOB_NO` IS NOT NULL)
  90. OR (n1.`JOB_NO` IS NOT NULL)
  91. OR (n2.`JOB_NO` IS NOT NULL)
  92. OR (n3.`JOB_NO` IS NOT NULL)
  93. )
  94. AND (r.HOUSE_KEY != '')
  95. r.`JOB_NO`
  96. h.`ROAD`, h.HOUSENO
  97.