Advertisement
aadddrr

F AGGREGATE PERCENTAGE

Mar 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION f_agregate_percentage(character varying, character varying, character varying, integer, integer, integer)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     pSessionId      ALIAS FOR $1;
  6.     pIdData         ALIAS FOR $2;
  7.     pDelimeter      ALIAS FOR $3;
  8.     pChild          ALIAS FOR $4;
  9.     pParent         ALIAS FOR $5;  
  10.     pDecimalPoint       ALIAS FOR $6;
  11.  
  12. BEGIN
  13.     DELETE FROM tt_dashboard_data WHERE session_id = pSessionId AND id_data = pIdData;
  14.     DELETE FROM tt_dashboard_data_precision WHERE session_id = pSessionId AND id_data = pIdData;
  15.     DELETE FROM tt_dashboard_measure_precision WHERE session_id = pSessionId AND id_data = pIdData;
  16.  
  17.     IF pChild = 1 THEN
  18.       UPDATE tt_input_data SET child_group = data_group_1 WHERE session_id = pSessionId AND id_data = pIdData;
  19.     ELSE
  20.         IF pChild = 2 THEN
  21.           UPDATE tt_input_data SET child_group = data_group_1||pDelimeter||data_group_2 WHERE session_id = pSessionId AND id_data = pIdData;
  22.         ELSE
  23.             IF pChild = 3 THEN
  24.               UPDATE tt_input_data SET child_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3 WHERE session_id = pSessionId AND id_data = pIdData;
  25.             ELSE
  26.                 IF pChild = 4 THEN
  27.                   UPDATE tt_input_data SET child_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3||pDelimeter||data_group_4 WHERE session_id = pSessionId AND id_data = pIdData;
  28.                 ELSE
  29.                   UPDATE tt_input_data SET child_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3||pDelimeter||data_group_4||pDelimeter||data_group_5 WHERE session_id = pSessionId AND id_data = pIdData;
  30.                 END IF;
  31.             END IF;
  32.         END IF;
  33.     END IF;
  34.    
  35.     IF pParent = 1 THEN
  36.       UPDATE tt_input_data SET parent_group = data_group_1 WHERE session_id = pSessionId AND id_data = pIdData;
  37.     ELSE
  38.         IF pParent = 2 THEN
  39.           UPDATE tt_input_data SET parent_group = data_group_1||pDelimeter||data_group_2 WHERE session_id = pSessionId AND id_data = pIdData;
  40.         ELSE
  41.             IF pParent = 3 THEN
  42.               UPDATE tt_input_data SET parent_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3 WHERE session_id = pSessionId AND id_data = pIdData;
  43.             ELSE
  44.                 IF pParent = 4 THEN
  45.                   UPDATE tt_input_data SET parent_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3||pDelimeter||data_group_4 WHERE session_id = pSessionId AND id_data = pIdData;
  46.                 ELSE
  47.                   UPDATE tt_input_data SET parent_group = data_group_1||pDelimeter||data_group_2||pDelimeter||data_group_3||pDelimeter||data_group_4||pDelimeter||data_group_5 WHERE session_id = pSessionId AND id_data = pIdData;
  48.                 END IF;
  49.             END IF;
  50.         END IF;
  51.     END IF;
  52.  
  53.     INSERT INTO tt_group_data
  54.     (session_id,id_data,data_group_1,data_group_2,data_group_3,data_group_4,data_group_5,
  55.     child_group,parent_group)
  56.     SELECT session_id, id_data, data_group_1, data_group_2,
  57.         data_group_3, data_group_4, data_group_5,
  58.         child_group, parent_group
  59.     FROM tt_input_data
  60.     WHERE session_id = pSessionId AND
  61.         id_data = pIdData
  62.     GROUP BY session_id, id_data, data_group_1, data_group_2, data_group_3, data_group_4, data_group_5,
  63.         child_group,parent_group;
  64.    
  65.         /**
  66.          * Adrian, Mar 27, 2017
  67.          * Add tax_amount, flg_tax_amount, tax_id
  68.          */
  69.         INSERT INTO tt_dashboard_data
  70.         (session_id,id_data,child_group,parent_group,
  71.          sum_measure, min_measure,max_measure,avg_measure,
  72.          sub_total, total, percentage,
  73.          total_measure, percentage_measure,
  74.          tax_amount, flg_tax_amount, tax_id)
  75.         SELECT DISTINCT session_id, id_data, child_group, parent_group,
  76.                SUM(data_measure) OVER (PARTITION BY child_group),
  77.                MIN(data_measure) OVER (PARTITION BY child_group),
  78.                MAX(data_measure) OVER (PARTITION BY child_group),
  79.                AVG(data_measure) OVER (PARTITION BY child_group),
  80.                SUM(data_count) OVER (PARTITION BY child_group),
  81.                SUM(data_count) OVER (PARTITION BY parent_group),
  82.                100,
  83.                SUM(data_measure) OVER (PARTITION BY parent_group),
  84.                100,
  85.                SUM(tax_amount) OVER (PARTITION BY child_group),
  86.                flg_tax_amount, tax_id
  87.         FROM tt_input_data
  88.         WHERE session_id = pSessionId AND id_data = pIdData
  89.         ORDER BY child_group;
  90.  
  91.     UPDATE tt_dashboard_data SET percentage = ROUND(100*sub_total/total,pDecimalPoint)::numeric WHERE session_id = pSessionId AND id_data = pIdData;        
  92.    
  93.     /**
  94.      * Adrian, Mar 27, 2017
  95.      * Handle division by zero
  96.      */
  97.     UPDATE tt_dashboard_data SET percentage_measure =
  98.         CASE WHEN total_measure > 0 THEN ROUND(100*sum_measure/total_measure,pDecimalPoint)::numeric
  99.         ELSE 0 END
  100.     WHERE session_id = pSessionId AND id_data = pIdData;   
  101.  
  102.     INSERT INTO tt_dashboard_data_precision
  103.     (session_id, id_data, rank_id,
  104.     child_group, percentage,
  105.     total_percentage, sum_percentage)
  106.     SELECT session_id, id_data, RANK() OVER (PARTITION BY parent_group ORDER BY parent_group, sub_total DESC, id DESC),
  107.         child_group, percentage,
  108.         100, SUM(percentage) OVER (PARTITION BY parent_group)
  109.     FROM tt_dashboard_data
  110.     WHERE session_id = pSessionId AND id_data = pIdData;
  111.  
  112.     UPDATE tt_dashboard_data_precision
  113.     SET percentage = percentage - (sum_percentage - total_percentage)
  114.     WHERE session_id = pSessionId AND
  115.         rank_id = 1 AND
  116.         id_data = pIdData;
  117.        
  118.     INSERT INTO tt_dashboard_measure_precision
  119.     (session_id, id_data, rank_id,
  120.     child_group, percentage,
  121.     total_percentage, sum_percentage)
  122.     SELECT session_id, id_data, RANK() OVER (PARTITION BY parent_group ORDER BY parent_group, sum_measure DESC, id DESC),
  123.         child_group, percentage_measure,
  124.         100, SUM(percentage_measure) OVER (PARTITION BY parent_group)
  125.     FROM tt_dashboard_data
  126.     WHERE session_id = pSessionId AND id_data = pIdData;
  127.  
  128.     UPDATE tt_dashboard_measure_precision
  129.     SET percentage = percentage - (sum_percentage - total_percentage)
  130.     WHERE session_id = pSessionId AND
  131.         rank_id = 1 AND
  132.         id_data = pIdData;
  133.    
  134.     /**
  135.      * Adrian, Mar 27, 2017
  136.      * Add tax_amount, flg_tax_amount, tax_id
  137.      */
  138.     INSERT INTO tt_output_data
  139.     (session_id, id_data,data_group_1,data_group_2,
  140.     data_group_3,data_group_4,data_group_5,
  141.     child_group,parent_group,
  142.     sum_measure,min_measure,max_measure,avg_measure,
  143.     sub_total,total,percentage,
  144.     total_measure, percentage_measure,
  145.     tax_amount, flg_tax_amount, tax_id)
  146.     SELECT DISTINCT a.session_id, a.id_data, c.data_group_1, c.data_group_2,
  147.         c.data_group_3, c.data_group_4, c.data_group_5,
  148.         a.child_group, a.parent_group,
  149.         ROUND(a.sum_measure,pDecimalPoint) AS sum_measure,
  150.         ROUND(a.min_measure,pDecimalPoint) AS min_measure,
  151.         ROUND(a.max_measure,pDecimalPoint) AS max_measure,
  152.         ROUND(a.avg_measure,pDecimalPoint) AS avg_measure,
  153.         a.sub_total, a.total,
  154.         b.percentage,
  155.         a.total_measure, d.percentage,
  156.         ROUND(a.tax_amount,pDecimalPoint) AS tax_amount,
  157.         a.flg_tax_amount, a.tax_id
  158.     FROM tt_dashboard_data a,tt_dashboard_data_precision b,tt_group_data c, tt_dashboard_measure_precision d
  159.     WHERE a.session_id = b.session_id AND
  160.         a.child_group = b.child_group AND
  161.         a.id_data = b.id_data AND
  162.         a.session_id = pSessionId AND
  163.         a.id_data = pIdData AND
  164.         a.session_id = c.session_id AND
  165.         a.id_data = c.id_data AND
  166.         a.child_group = c.child_group AND
  167.         a.session_id = d.session_id AND
  168.         a.child_group = d.child_group AND
  169.         a.id_data = d.id_data
  170.    
  171.     ORDER BY a.child_group;
  172.  
  173.     DELETE FROM tt_dashboard_data WHERE session_id = pSessionId AND id_data = pIdData;
  174.     DELETE FROM tt_dashboard_data_precision WHERE session_id = pSessionId AND id_data = pIdData;
  175.     DELETE FROM tt_dashboard_measure_precision WHERE session_id = pSessionId AND id_data = pIdData;
  176.     DELETE FROM tt_input_data WHERE session_id = pSessionId AND id_data=pIdData;
  177.     DELETE FROM tt_group_data WHERE session_id = pSessionId AND id_data=pIdData;
  178.        
  179. END;
  180. $BODY$
  181.   LANGUAGE plpgsql VOLATILE
  182.   COST 100;
  183.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement