仅在汇总查询中从单个字段中删除重复项

Remove duplicates from single field only in rollup query

我有一个 table 的数据用于库存的个别审计。每个审计都有一个位置、一个期望值、一个方差值和一些在这里并不重要的其他数据。

我正在为 Cognos 11 编写一个查询,它总结了一周的这些审计。目前,它按位置 class 将所有内容汇总到总和中。我的问题是可能对各个位置进行多次审计,而我希望方差字段对所有审计的数据求和,而不管它是否是该位置的第一个计数,我只想要不同的期望值位置(即只有位置不同的 SUM 预期值).

以下是查询的简化版本。这甚至可能吗,或者我是否必须在 Cognos 中编写一个单独的查询,并使其成为两个必须在事后合并的报告?您可能会说,我是 SQL 和 Cognos 的新手。

SELECT COALESCE(CASE 
                WHEN location_class = 'A'
                    THEN 'Active'
                WHEN location_class = 'C'
                    THEN 'Active'
                WHEN location_class IN (
                        'R'
                        ,'0'
                        )
                    THEN 'Reserve'
                END, 'Grand Total') "Row Labels"
        ,SUM(NVL(expected_cost, 0)) "Sum of Expected Cost"
        ,SUM(NVL(variance_cost, 0)) "Sum of Variance Cost"
        ,SUM(ABS(NVL(variance_cost, 0))) "Sum of Absolute Cost"
        ,COUNT(DISTINCT location) "Count of Locations"
        ,(SUM(NVL(variance_cost, 0)) / SUM(NVL(expected_cost, 0))) "Variance"
    FROM audit_table
    WHERE audit_datetime <= #prompt('EndDate') # audit_datetime >= #prompt('StartDate') #
    GROUP BY ROLLUP(CASE 
                WHEN location_class = 'A'
                    THEN 'Active'
                WHEN location_class = 'C'
                    THEN 'Active'
                WHEN location_class IN (
                        'R'
                        ,'0'
                        )
                    THEN 'Reserve'
                END)
    ORDER BY 1 ASC

这就是我希望得到的结果:

感谢您的帮助!

你试过像这样把不同的放在底部吗?

(SUM(NVL(variance_cost,0)) / SUM(NVL(expected_cost,0))) "方差",

COUNT(不同位置)“位置计数”

从audit_table

您是否尝试过查看 SQL 中的 OVER 子句?它允许您在结果集中使用窗口函数,以便您可以根据特定条件获得聚合。这可能会有所帮助,因为您似乎试图根据更大分组中的不同分组来获取数据总和。

例如,假设我们有以下数据集:

group1      group2      val         dateadded
----------- ----------- ----------- -----------------------
1           1           1           2020-11-18
1           1           1           2020-11-20
1           2           10          2020-11-18
1           2           10          2020-11-20
2           3           100         2020-11-18
2           3           100         2020-11-20
2           4           1000        2020-11-18
2           4           1000        2020-11-20

使用单个查询,我们可以return“group1”中“val”的总和以及“group2”中第一个(基于日期时间)“val”记录的总和:

declare @table table (group1 int, group2 int, val int, dateadded datetime)
insert into @table values (1, 1, 1, getdate())
insert into @table values (1, 1, 1, dateadd(day, 1, getdate()))
insert into @table values (1, 2, 10, getdate())
insert into @table values (1, 2, 10, dateadd(day, 1, getdate()))
insert into @table values (2, 3, 100, getdate())
insert into @table values (2, 3, 100, dateadd(day, 1, getdate()))
insert into @table values (2, 4, 1000, getdate())
insert into @table values (2, 4, 1000, dateadd(day, 1, getdate()))

select t.group1, sum(t.val) as group1_sum, group2_first_val_sum
from @table t
inner join
(
    select group1, sum(group2_first_val) as group2_first_val_sum
    from
    (
        select group1, val as group2_first_val, row_number() over (partition by group2 order by dateadded) as rownumber
        from @table
    ) y
    where rownumber = 1
    group by group1
    
) x on t.group1 = x.group1
group by t.group1, x.group2_first_val_sum

这 return 是以下结果集:

group1      group1_sum  group2_first_val_sum
----------- ----------- --------------------
1           22          11
2           2200        1100

联接中的最内部子查询 table 根据“group2”对数据集中的行进行编号,导致记录在“rownum”中具有“1”或“2”列,因为每个“group2”中只有 2 条记录。

下一个子查询获取该数据并过滤掉所有不是第一行 (rownum = 1) 的行并对“val”数据求和。

主查询从主查询中获取每个“group1”中“val”的总和table,然后加入子查询table以仅获取第一个的“val”总和每个“group2”中的记录。

有更有效的方法来编写它,例如将“group1”值的总和移动到 SELECT 语句中的子查询,以摆脱其中一个嵌套的 tabled 子查询,但我想展示如何在 SELECT 语句中不使用子查询。