【问题标题】:Group/Summarize each row with removal row if total quantity is 0如果总数量为 0,则使用删除行对每一行进行分组/汇总
【发布时间】:2020-04-27 04:01:48
【问题描述】:

如何分组/汇总如下图示例。
相同的数据将根据日期和项目列进行分组。
数量将是总和。

如果负数大于最小日期的总数量(total qty = 0),该行将被删除。

这种情况也将持续到下一个 min 日期。

在这种情况下,2020 年 1 月 1 日和 2020 年 1 月 2 日将被删除,因为负数超过这 2 天的总和。

如果您需要示例表,请使用下面的脚本。

CREATE TABLE #temp_table(
[id] [int] IDENTITY(1,1) NOT NULL,
[trans_date] [date] NOT NULL,
[item] [nvarchar](40) NOT NULL,
[qty] [int] NOT NULL,
)
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '1-Jan-2020',      'Item A',     2  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '2-Jan-2020',      'Item A',     4  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '3-Jan-2020',      'Item B',     1  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '3-Jan-2020',      'Item A',     3  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '4-Jan-2020',      'Item A',     -1  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '5-Jan-2020',      'Item A',     -6  )
INSERT INTO #temp_table (     trans_date,     item,     qty )
VALUES
(     '6-Jan-2020',      'Item A',     4  )


SELECT * FROM #temp_table 


DROP TABLE #temp_table

我的第一次尝试是

select 
trans_date
, item
, SUM(qty)
from temp_table 
group BY 
trans_date
, item

我的第二次尝试,当我第一行为0时,我觉得我缺乏一些条件来减少下一行。

select 
temp_table.trans_date
, temp_table.item
, SUM(temp_table.qty) + SUM(neg_table.neg_qty)
from  temp_table
OUTER APPLY (
SELECT ISNULL( SUM(neg.qty), 0) AS neg_qty FROM pca_temp_table neg
WHERE 1=1
and temp_table.item = neg.item
and neg.qty < 0
)  as neg_table
WHERE qty > 0
group BY 
trans_date
, item

【问题讨论】:

  • 请展示你的尝试
  • 我无法理解您的消极/积极状况 - 我建议您详细展示您的工作。
  • 刚刚编辑了我的尝试。这很简单,但我的想法不多了。

标签: sql sql-server


【解决方案1】:

希望此查询适合您:

select MAX(CASE WHEN Quantity>0 THEN DATE ELSE NULL END), ITEM, SUM(Quantity)
from @T 
group BY ITEM

【讨论】:

  • 如果有更多 + 数量,这将不起作用。假设我们有另一行 06-Jan-2020,数量为 + 4 我希望项目 A 的最终结果包含 03-Jan-2020 = 2 和 06-Jan-2020 = 4
  • 我认为'Cursor' 可能是这个@Krsnik195 的更好选择,以避免未来与此相关的错误。
  • 我尽量避免使用 Cursor,因为我担心它会太慢,但看起来我别无选择。
猜你喜欢
  • 2021-12-29
  • 2018-03-23
  • 1970-01-01
  • 2020-11-17
  • 2017-05-31
  • 1970-01-01
  • 2023-03-04
  • 2021-04-29
  • 2020-02-16
相关资源
最近更新 更多