2016-12-16 57 views
0

all! 假設表格如下結構僅限具有給定條件的行

DECLARE @TempTable TABLE 
(
    idProduct INT, 
    Layers INT, 
    LayersOnPallet INT, 
    id INT IDENTITY(1, 1) NOT NULL, 
    Summarized BIT NOT NULL DEFAULT(0) 
) 

併產生下列插入語句的測試數據

INSERT INTO @TempTable(idProduct, Layers, LayersOnPallet) 
SELECT 1, 2, 4 
UNION ALL 
SELECT 1, 2, 4 
UNION ALL 
SELECT 1, 1, 4 
UNION ALL 
SELECT 2, 2, 4 

我想總結只有那些行(僅由層)具有相同idProduct並且將層的總和等於LayersOnPallet。

一張圖片勝過千言萬語:

enter image description here

從上面的圖片中,可以看到,只有先行進行了總結,因爲兩者具有相同的idProduct和總和(層)將等於LayersOnPallet。 我該如何做到這一點?只有在選擇時纔有辦法做到這一點(不適用於while)?

謝謝!

+0

這部分是不明確的「行與同idProduct和這將有層等於LayersOnPallet的總和。」 – DarkKnight

+0

謝謝你的迴應!我只想總結前兩行,因爲兩者都有相同的idProduct,總和(4)將等於LayersOnPallet(4)。 –

+0

層數之和(2 + 2)!= LayersOnPallet(4 + 4)之和。他們是如何總結的? – DarkKnight

回答

1

也許這會做到這一點。注意我的意見:

-- your sample data 
DECLARE @TempTable TABLE 
(
    idProduct INT, 
    Layers INT, 
    LayersOnPallet INT, 
    id INT IDENTITY(1, 1) NOT NULL, 
    Summarized BIT NOT NULL DEFAULT(0) 
) 
INSERT INTO @TempTable(idProduct, Layers, LayersOnPallet) 
SELECT 1, 2, 4 UNION ALL 
SELECT 1, 2, 4 UNION ALL 
SELECT 1, 1, 4 UNION ALL 
SELECT 2, 2, 4; 

-- an intermediate temp table used for processing 
IF OBJECT_ID('tempdb..#processing') IS NOT NULL DROP TABLE #processing; 

-- let's populate the #processing table with duplicates 
SELECT 
    idProduct, 
    Layers, 
    LayersOnPallet, 
    rCount = COUNT(*) 
INTO #processing 
FROM @tempTable 
GROUP BY 
    idProduct, 
    Layers, 
    LayersOnPallet 
HAVING COUNT(*) > 1; 

-- Remove the duplicates 
DELETE t 
FROM @TempTable t 
JOIN #processing p 
    ON p.idProduct  = t.idProduct 
    AND p.Layers   = t.Layers 
    AND p.LayersOnPallet = t.LayersOnPallet 

-- Add the new, updated record 
INSERT @TempTable 
SELECT 
    idProduct, 
    Layers * rCount, 
    LayersOnPallet, 1 
FROM #processing; 

DROP TABLE #processing; -- cleanup 

-- Final output 
SELECT idProduct, Layers, LayersOnPallet, Summarized 
FROM @TempTable; 

結果:

idProduct Layers  LayersOnPallet Summarized 
----------- ----------- -------------- ---------- 
1   4   4    1 
1   1   4    0 
2   2   4    0 
+0

謝謝您的回答! –