仅在汇总查询中从单个字段中删除重复项
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 语句中不使用子查询。
我有一个 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 语句中不使用子查询。