2015-09-10 73 views
0

說我有一個這樣的表稱爲庫存,例如:SQL:分組表;刪除互惠對?

+----+------------+-------+ 
| id |Product_ID | Count | 
+----+------------+-------+ 
| 1 | 1   |  4 | 
| 2 | 2   |  5 | 
| 3 | 4   |  3 | 
| 4 | 5   |  3 | 
| 5 | 5   | -3 | 
| 6 | 2   | -5 | 
+----+------------+-------+ 

而且我的查詢GroupedInventory AS的結果(選擇ID,PRODUCT_ID,計數從庫存ORDER BY PRODUCT_ID給我(存儲在GroupedInventory):

+----+------------+-------+ 
| id |Product_ID | Count | 
+----+------------+-------+ 
| 1 | 1   |  4 | 
| 2 | 2   |  5 | 
| 6 | 2   | -5 | 
| 3 | 4   |  3 | 
| 4 | 5   |  3 | 
| 5 | 5   | -3 | 
+----+------------+-------+ 

我想刪除匹配的陽性和陰性結果那麼到底這個表應該變成:

+----+------------+-------+ 
| id |Product_ID | Count | 
+----+------------+-------+ 
| 1 | 1   |  4 | 
| 3 | 4   |  3 | 
+----+------------+-------+ 

我處理順序語言,我只是不能包裹我的頭。我的想法是告訴我循環遍歷表,存儲對,然後在原始表中通過id刪除對。

+3

我不認爲你的規範是明確的 - 它始終是總爲0兩項或任意數量的總數爲0的項目? – Hogan

+4

你想要什麼,如果你有重複,但總和不是零? –

回答

1
with GroupedInventory as 
(
SELECT Product_id, abs(sum(case when count < 0 then count else 0 end)) Negative, abs(sum(case when count > 0 then count else 0 end)) Positive 
FROM inventory 
group by Product_id 
) 
delete from inventory 
where Product_id in (select Product_id from GroupedInventory where positive = negative); 

雖然有效性也取決於不確定的規則,作爲一個給定的product_id多少項目能存在這樣的。

+0

這絕對有效!謝謝。但有一個問題,如果他們不積極和消極呢?說我添加了一個額外的列,這是一個外鍵,添加「1」,刪除「2」?我將如何刪除1:2對? –

+0

@凱文大致相同;您只需更改case語句以查找特定值而不是> 0和<0。case語句將它們實現爲不同的列,您可以命名任何您想要的名稱。 與GroupedInventory如 ( SELECT PRODUCT_ID,ABS(總和(情況下,當計數= 1,則計數否則爲0結束))的,ABS(總和(情況下,當計數= 2,則計數否則爲0結束))三三兩兩 FROM庫存 group by Product_id ) 從庫存中刪除 其中Product_id in(從GroupedInventory where Ones = Twos中選擇Product_id); – user3111227

0

試試這個:

SELECT id, Product_ID, SUM(Count) 
FROM [GroupedInventory] 
WHERE SUM(Count) <> 0 
GROUP BY Product_ID, id 

我不是100%肯定,將沒有測試它自己的工作,讓我知道如果你得到一個奇怪的結果。

+0

如果有三個總和爲0的Product_ID,該怎麼辦? I.E. -1,-2和3.也許這不是OP的問題。 –

+1

使用GROUP BY時,使用HAVING而不是WHERE。 – JodyT

0

使用此uqery:

SELECT 
    MIN(GI.ID) AS ID, GI.Product_ID, SUM(GI.Count) As COUNT 
FROM 
    GroupedInventory AS GI 
GROUP BY 
    GI.Product_ID 
HAVING 
    SUM(GI.Count) <> 0; 

我用MINSUM這樣的結果,你將有分組,以MIN ID總和計算。我不知道這是否是期望的結果。不清楚。

0

您可以嘗試使用OVER子句與PARTITION BY以及您可以read it here。 這裏是您給定的測試數據的查詢,

create table #temp 
(id bigint, 
proid bigint, 
cnt bigint) 


insert into #temp 
values(1,1,4), 
(2,2,5), 
(3,4,3), 
(4,5,3), 
(5,5,-3), 
(6,2,-5) 

;WITH cte 
AS(
    SELECT id, proid, SUM(cnt) OVER(PARTITION BY proid) AS total 
    FROM #temp 
) 

SELECT * 
FROM cte 
WHERE total <> 0 


Drop table #temp 
0

試試這個

DELETE inventory 
FROM inventory 
    INNER JOIN (
     SELECT Product_ID FROM inventory group by Product_ID HAVING SUM(Count)=0 
    ) as t ON inventory.Product_ID = t.Product_ID