0

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

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

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

聚合器函数中是否可以有超过 3 个参数?


2016 年 5 月 18 日更新:

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

SELECTGROUPS、ROLLUPGROUPS 和 FIELDSGROUPS 被用户完成的自定义分组所取代。

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

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

汇总级别将基于用户希望在显示最后一个级别的详细信息之前向下钻取的字段 (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; } };

                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;    

4

0 回答 0