2016-12-16 5 views
0

すべて! 次のテーブル構造指定された条件の行のみを要約する

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

を生成次のINSERT文与えられたテストデータ

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

この部分は明確ではありません – DarkKnight

+0

ありがとうございました!私は同じidProductとsum(4)がLayersOnPallet(4)に等しくなるので、最初の2行だけを合計したいと思います。 –

+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と行とそのLayersOnPalletに等しい層の合計を持っています」

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

ありがとうございます! –

関連する問題