alasql汇总函数中的父键和子键

时间:2016-04-19 15:26:50

标签: alasql

使用汇总时,我需要在所有子记录上都有父键。有没有简单的方法可以使用alasql和汇总来解决这个问题?

它将用于在报告中显示/隐藏子行。

报告中有多个级别的小计。一个孩子可以有新的孩子。

聚合器函数中是否可以有3个以上的参数?

2016年5月18日更新:

我想创建一个带有明细的帐户报告。我已经设法通过使用自定义函数来获得级别和级别描述。 leveldescription和level是自定义函数,用于在每个聚合上获取正确的文本。 filterDimension是一个自定义函数,用于过滤值数组。

SELECTGROUPS,ROLLUPGROUPS和FIELDSGROUPS被用户自定义分组所取代。

这解决了显示和隐藏孩子的主要问题。现在我想在一个字段中获得最后一次聚合的所有细节。我现在使用自定义函数“CHILDREN(a._)作为孩子”基于此解决方案https://github.com/agershun/alasql/issues/571

但我只想在最高级别的聚合上显示详细信息。现在我为每个级别的聚合获得了孩子。

汇总级别将基于用户在显示最后一级详细信息之前要深入查看的字段(R1 .. R12)。

alasql.aggr.CHILDREN = function(val, acc, stage) { console.log(stage); if(stage == 1 || stage == 2) { if(typeof acc == 'undefined') { if(val && Object.keys(val).length > 0) { return [val]; } else {
return; } } else { acc.push(val); return acc; } } else { return acc; } };

alasql.aggr.CHILDREN = function(val, acc, stage) { console.log(stage); if(stage == 1 || stage == 2) { if(typeof acc == 'undefined') { if(val && Object.keys(val).length > 0) { return [val]; } else {
return; } } else { acc.push(val); return acc; } } else { return acc; } };

                SET @data = ?;
                SET @year = ?;
                SET @r1s = ?;

                with reportdefinition as 
                (
                   select * from @data
                ), data as 
                ( 
                   SELECT * FROM (
                     SELECT c1.yr, 
                            c1.acno, 
                            c1.acnm,
                            c1.webpg,
                            c1.txt,
                            c1.r1, c1.r1nm,
                            c1.r2, c1.r2nm,
                            c1.r3, c1.r3nm,
                            c1.r4, c1.r4nm,
                            c1.r5, c1.r5nm,
                            c1.r6, c1.r6nm,
                            c1.r7, c1.r7nm,
                            c1.r8, c1.r8nm,
                            c1.r9, c1.r9nm,
                            c1.r10, c1.r10nm,
                            c1.r11, c1.r11nm,
                            c1.r12, c1.r12nm,
                            CASE WHEN pr = 1 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as jan,      
                            CASE WHEN pr = 2 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as feb,      
                            CASE WHEN pr = 3 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as mar,      
                            CASE WHEN pr = 4 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as apr,      
                            CASE WHEN pr = 5 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as may,      
                            CASE WHEN pr = 6 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as jun,      
                            CASE WHEN pr = 7 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as jul,      
                            CASE WHEN pr = 8 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as aug,      
                            CASE WHEN pr = 9 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as sep,      
                            CASE WHEN pr = 10 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as oct,      
                            CASE WHEN pr = 11 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as nov,      
                            CASE WHEN pr = 12 AND c1.bgno = 0 THEN c1.acam ELSE 0 END as dec,      
                            CASE WHEN c1.bgno = 0 THEN c1.acam ELSE 0 END tot,          
                            CASE WHEN pr = 1 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as jan_bg,      
                            CASE WHEN pr = 2 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as feb_bg,      
                            CASE WHEN pr = 3 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as mar_bg,      
                            CASE WHEN pr = 4 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as apr_bg,      
                            CASE WHEN pr = 5 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as may_bg,      
                            CASE WHEN pr = 6 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as jun_bg,      
                            CASE WHEN pr = 7 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as jul_bg,      
                            CASE WHEN pr = 8 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as aug_bg,      
                            CASE WHEN pr = 9 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as sep_bg,      
                            CASE WHEN pr = 10 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as oct_bg,     
                            CASE WHEN pr = 11 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as nov_bg,      
                            CASE WHEN pr = 12 AND c1.bgno = 2015 THEN c1.acam ELSE 0 END as dec_bg,      
                            CASE WHEN c1.bgno = 2015 THEN c1.acam ELSE 0 END tot_bg      
                    FROM table1 AS c1      
                    WHERE c1.yr = @year.id      
                    AND c1.pr <= 5      
                    AND (c1.bgno = 0 or c1.bgno = 2015)
                    AND filterDimension("id", @r1s, r1)
                    )
                ), result as 
                (
                    select * 
                    from data as d1 
                    join reportdefinition as d2 on d1.acno >= d2.fromvalue and d1.acno <= d2.tovalue
                )
                SELECT *, leveldescription(group1, group2, group3[FIELDSGROUPS]) as description, level(group1, group2, group3[FIELDSGROUPS]) as level
                FROM (
                        SELECT rownum() as id, FIRST(group1) as group1, group2, group3, [SELECTGROUPS]
                            SUM(jan) as jan,
                            SUM(feb) as feb,
                            SUM(mar) as mar,
                            SUM(apr) as apr,
                            SUM(may) as may,
                            SUM(jun) as jun,
                            SUM(jul) as jul,
                            SUM(aug) as aug,
                            SUM(sep) as sep,
                            SUM(oct) as oct,
                            SUM(nov) as nov,
                            SUM(dec) as dec,
                            SUM(tot) as tot,
                            SUM(jan_bg) as jan_bg,
                            SUM(feb_bg) as feb_bg,
                            SUM(mar_bg) as mar_bg,
                            SUM(apr_bg) as apr_bg,
                            SUM(may_bg) as may_bg,
                            SUM(jun_bg) as jun_bg,
                            SUM(jul_bg) as jul_bg,
                            SUM(aug_bg) as aug_bg,
                            SUM(sep_bg) as sep_bg,
                            SUM(oct_bg) as oct_bg,
                            SUM(nov_bg) as nov_bg,
                            SUM(dec_bg) as dec_bg,
                            SUM(tot_bg) as tot_bg,
                            CHILDREN(a._) as children
                        FROM result AS a
                        GROUP BY ROLLUP(group2, group3[ROLLUPGROUPS]) 
                        ORDER BY group2, group3[FIELDSGROUPS]
                )
                ORDER BY CASE WHEN id = 1 THEN 2 ELSE 1 END, id;    

0 个答案:

没有答案