Advertisement
justhrun

helminst_crosstab.esqiuel

Sep 7th, 2014
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 3.74 KB | None | 0 0
  1. DROP PROCEDURE IF EXISTS viewSalesByWeek;
  2. -- call viewSalesByWeek(2014,9)
  3. DELIMITER $$
  4. CREATE PROCEDURE viewSalesByWeek
  5. (
  6. iYEAR INTEGER,
  7. iMonth INTEGER
  8. )
  9. BEGIN
  10.  
  11. DROP TABLE IF EXISTS SalesProduct;
  12. CREATE TABLE SalesProduct
  13. (
  14. SALE_IDXX VARCHAR(200),
  15. SALE_DATE VARCHAR(10),
  16. SALE_OUTL VARCHAR(200),
  17. SALE_AMNT NUMERIC(15,2)
  18. );
  19.  
  20. DROP TABLE IF EXISTS Outlet;
  21. CREATE TABLE Outlet
  22. (
  23. OUTL_IDXX VARCHAR(200),
  24. OUTL_NAME VARCHAR(200)
  25. );
  26.  
  27. DROP TABLE IF EXISTS ListWeek;
  28. CREATE TABLE ListWeek
  29. (
  30. WEEK_NUMB INTEGER,
  31. MONT_NUMB INTEGER,
  32. YEAR_NUMB INTEGER
  33. );
  34.  
  35. Insert into Outlet values ('O-0001','Test Outlet 1');
  36. Insert into Outlet values ('O-0002','Test Outlet 2');
  37. Insert into Outlet values ('O-0003','Test Outlet 3');
  38.  
  39. Insert Into SalesProduct values ('F-0001','01/09/2014','O-0001',23000000);
  40. Insert Into SalesProduct values ('F-0001','02/09/2014','O-0003',13500000);
  41. Insert Into SalesProduct values ('F-0001','13/09/2014','O-0002',11254000);
  42. Insert Into SalesProduct values ('F-0001','17/09/2014','O-0003',9500000);
  43. Insert Into SalesProduct values ('F-0001','20/09/2014','O-0001',15244400);
  44. Insert Into SalesProduct values ('F-0001','20/09/2014','O-0002',58700000);
  45. Insert Into SalesProduct values ('F-0001','21/09/2014','O-0003',98635000);
  46. Insert Into SalesProduct values ('F-0001','25/09/2014','O-0001',12347770);
  47.  
  48. INSERT INTO ListWeek
  49. select DISTINCT MINGGU_KE,MONTH(TANGGAL),YEAR(TANGGAL) from
  50. ( select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) tanggal,
  51. date_format(adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0),'%U') minggu_ke
  52. from
  53. (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
  54. (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
  55. (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
  56. (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
  57. (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) bla
  58. where MONTH(TANGGAL)=iMonth AND YEAR(TANGGAL)=iYEAR ;
  59.  
  60. /* ############# WARNING #############
  61. output GROUP_CONCAT() di sini gede buanget
  62. sesuaikan variable settingan MySQL "group_concat_max_len" default hanya 1024 (1kB)
  63. kalau masih elor silakan rubah jadi 10kB :
  64. - di /etc/my.cnf : group_concat_max_len = 10K
  65. - di konsol mysql: mysql> SET GLOBAL group_concat_max_len = 10240;
  66.    ####################################
  67. */
  68. -- QUERY
  69. SET @Sql = null;
  70. SET @Sql =
  71. (SELECT CONCAT("SELECT B.SALE_OUTL,C.OUTL_NAME,","\n",
  72. GROUP_CONCAT(DISTINCT CONCAT(
  73. "CASE A.WEEK_NUMB \n \t WHEN ", A.WEEK_NUMB, " THEN ","\n \t\t",
  74. " CASE WHEN ","\n \t\t\t\t",
  75. " SUM(IF(DATE_FORMAT(STR_TO_DATE(B.SALE_DATE,'%d/%m/%Y'),'%U')=", A.WEEK_NUMB, ",SALE_AMNT,0)) IS NULL",
  76. " \n \t\t THEN 0 ELSE ","\n \t\t\t\t",
  77. " SUM(IF(DATE_FORMAT(STR_TO_DATE(B.SALE_DATE,'%d/%m/%Y'),'%U')=", A.WEEK_NUMB, ",SALE_AMNT,0)) END ",
  78. " \n \t ELSE 0 \nEND AS 'PEKAN_KE_", A.WEEK_NUMB, "',", "\n")
  79. ORDER BY A.WEEK_NUMB
  80. separator ''
  81. ),
  82. "SUM(B.SALE_AMNT) AS 'SALE_GRAN'",
  83. "\nFROM ListWeek A
  84. LEFT JOIN SalesProduct B
  85. ON A.YEAR_NUMB = YEAR(STR_TO_DATE(B.SALE_DATE,'%d/%m/%Y'))
  86. AND A.MONT_NUMB = MONTH(STR_TO_DATE(B.SALE_DATE,'%d/%m/%Y'))
  87. INNER JOIN Outlet C
  88. ON B.SALE_OUTL = C.OUTL_IDXX
  89. GROUP BY B.SALE_OUTL,C.OUTL_NAME") STATEMENT
  90. FROM ListWeek A
  91. );
  92.  
  93. -- SELECT @SQL;
  94.  
  95. PREPARE stmt FROM @sql;
  96. EXECUTE stmt;
  97. DEALLOCATE PREPARE stmt;
  98.  
  99. END $$
  100. DELIMITER ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement