我有这张桌子
CREATE TABLE #temp
(
Item VARCHAR(max),
Qty DECIMAL(18,2),
FixItem VARCHAR(max)
)
这是一些示例数据
INSERT INTO #temp (Item, Qty, FixItem)
VALUES ('ItemRandom-1', -- Item - varchar(max)
2, -- Qty - decimal
'ItemA' -- FixItem - varchar(max)
)
INSERT INTO #temp (Item, Qty, FixItem)
VALUES ('ItemRandom-2', -- Item - varchar(max)
5, -- Qty - decimal
'ItemA' -- FixItem - varchar(max)
)
INSERT INTO #temp (Item, Qty, FixItem)
VALUES ('ItemRandom-3', -- Item - varchar(max)
5, -- Qty - decimal
'ItemB' -- FixItem - varchar(max)
)
INSERT INTO #temp (Item, Qty, FixItem)
VALUES ('ItemRandom-4', -- Item - varchar(max)
5, -- Qty - decimal
'' -- FixItem - varchar(max)
)
INSERT INTO #temp (Item, Qty, FixItem)
VALUES ('ItemRandom-5', -- Item - varchar(max)
5, -- Qty - decimal
'' -- FixItem - varchar(max)
)
选择它时的结果如下:
Item Qty FixItem
--------------------------------
ItemRandom-1 2.00 ItemA
ItemRandom-2 5.00 ItemA
ItemRandom-3 5.00 ItemB
ItemRandom-4 5.00
ItemRandom-5 5.00
我想对FixItem
进行分组,以便我可以对Qty
求和,然后在ItemRandom-1
或ItemRandom-2
之间删除一行
结果应该是这样的:
Item Qty FixItem
---------------------------------
ItemRandom-1 7.00 ItemA
ItemRandom-3 5.00 ItemB
ItemRandom-4 5.00
ItemRandom-5 5.00
我怎样才能实现这一目标?提前致谢,对不起我的英语。
答案 0 :(得分:0)
这是实现结果的一种方法:
SELECT MIN(item) AS item,
SUM(qty) AS qty,
fixitem
FROM #temp
GROUP BY fixitem;
答案 1 :(得分:0)
我不知道您在寻找什么,但是对于实例而言,您需要使用GROUP BY
子句并使用min()
函数获取第一个{{1} ,不需要删除该项目。
Item
对我来说,删除操作将是不必要的操作,因为结果会显示qty SELECT
MIN(Item) Item,
SUM(Qty),
FixItem
FROM #temp t
GROUP BY FixItem
的总和,但实际会显示另一个,而不是ItemRandom-1的总和7
7
您可以使用窗口功能来实现结果
DELETE t FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY FixItem ORDER BY Item) Seq
FROM #temp
) t
WHERE Seq > 1
答案 2 :(得分:0)
这是一种方式。首先使用每个FixItem
的总数量更新您的表格。然后删除额外的行。
update a
set a.Qty = b.Qty
from
#temp a
join (
select
FixItem, Qty = sum(Qty)
from
#temp
group by FixItem
) b on a.FixItem = b.FixItem
;with cte as (
select *, rn = row_number() over (partition by FixItem order by Item)
from #temp
)
delete from cte
where rn > 1
select * from #temp
输出
Item Qty FixItem
--------------------------------
ItemRandom-1 7.00 ItemA
ItemRandom-3 5.00 ItemB
编辑:
update a
set a.Qty = b.Qty
from
#temp a
join (
select
FixItem, Qty = sum(Qty)
from
#temp
where len(FixItem) > 0
group by FixItem
) b on a.FixItem = b.FixItem
;with cte as (
select *, rn = case when len(FixItem) > 0 then row_number() over (partition by FixItem order by Item) else 0 end
from #temp
)
delete from cte
where rn > 1
答案 3 :(得分:0)
您可以使用选择查询来实现此目的,无需删除记录。 对于此选择查询,您还可以创建视图以便于访问。
根据要求,您可以在项目列中放置最小值或最大值。
select min(item) item, SUM(qty) qty, fixitem from #temp
where fixitem != '' group by fixitem
union all
select item, qty, fixitem from #temp
where fixitem = ''
答案 4 :(得分:0)
为什么不使用MERGE声明?
CREATE TABLE #temp(
Item VARCHAR(max),
Qty DECIMAL(18,2),
FixItem VARCHAR(max)
);
INSERT INTO #temp(Item, Qty, FixItem)
VALUES
('ItemRandom-1', 2, 'ItemA'),
('ItemRandom-2', 5, 'ItemA'),
('ItemRandom-3', 5, 'ItemB'),
('ItemRandom-4', 5, ''),
('ItemRandom-5', 5, '');
WITH
t AS (
SELECT *,
SUM(Qty)OVER(PARTITION BY FixItem) t,
ROW_NUMBER()OVER(PARTITION BY FixItem ORDER BY Item) n
FROM #temp
WHERE FixItem != ''
)
MERGE t USING (SELECT * FROM t WHERE n = 1) s
ON t.Item = s.Item AND t.FixItem = s.FixItem AND t.n = s.n
WHEN MATCHED THEN UPDATE SET t.Qty = s.t
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT $action, deleted.*;
SELECT * FROM #temp;
可以在rextester.com调查结果。
OUTPUT子句用于演示MERGE语句的功能。