2016-06-19 10 views
0

カーソルをテーブルの行全体に渡って重い重量を見つけたいと思っています。これは私がこれまでに得たものですが、正しい答えを提示しますが、現在の重量と以前の重量を比較し、カーソルが最も重い重量をプリントアウトするようにするにはどうすればよいですか? おかげで:)SQLカーソル比較前の値

DECLARE @weight DECIMAL(8,2), 
@name VARCHAR(100); 

DECLARE Cursor_Eight CURSOR 
FOR 
SELECT Name, Weight 
    FROM [SalesLT].[Product] 
    ORDER BY Weight DESC; 

OPEN Cursor_Eight 

FETCH NEXT FROM Cursor_Eight INTO @name, @weight 
PRINT @name + ' with a weight of ' + CONVERT(CHAR(8),@weight) + ' is the heaviest product.'; 

CLOSE Cursor_Eight 

DEALLOCATE Cursor_Eight 
+2

なぜ、カーソルを使用して、1セットの操作で同じことができるのですか? –

+2

'SELECT TOP(1)[SalesLT]からの名前、重量[製品] ORDER BY Weight DESC; - 乱雑なカーソルやひどいRBAR(行単位の行)処理が必要です..... –

答えて

0
declare @product table (name varchar(1), weight decimal(8,2)) 
insert into @product values 
('A',2.00), 
('b',1.00), 
('c',9.00), 
('d',7.00), 
('e',10.00), 
('f',2.00) 

DECLARE @weight DECIMAL(8,2), 
     @maxweight DECIMAL(8,2), 
     @maxname VARCHAR(100), 
     @name VARCHAR(100); 

DECLARE Cursor_Eight CURSOR 
FOR 
SELECT Name, Weight 
    FROM @Product 
    --ORDER BY Weight DESC; 

OPEN Cursor_Eight 

FETCH NEXT FROM Cursor_Eight INTO @maxname, @maxweight 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     FETCH NEXT FROM cursor_eight INTO @name,@weight 
     if @weight > @maxweight 
     begin 
      set @maxname = @name; 
      set @maxweight = @weight; 
     end 
end 
CLOSE Cursor_Eight 
PRINT @maxname + ' with a weight of ' + CONVERT(CHAR(8),@maxweight) + ' is the heaviest product.'; 
DEALLOCATE Cursor_Eight 
+0

なぜダウンスコア? –

1

あなたはこの作業のためにカーソルを使用する必要はありません。

1)(これは最大ですべての製品が表示されますあなたが唯一の最も重い行を表示する必要がある場合は、TOP(1) WITH TIESORDER BY Weight DESCは十分なはず重量):シンプル/遠く、より良いオプションがあるので、それは、カーソルを使用することが奇妙です。:

SELECT Name, Weight, 
CASE WHEN DENSE_RANK() OVER(ORDER BY Weight DESC) = 1 THEN 1 ELSE 0 END IsHeaviestProduct 
FROM (
SELECT 'A', 100 UNION ALL 
SELECT 'B', 150 UNION ALL 
SELECT 'C', 25 UNION ALL 
SELECT 'D', 150 UNION ALL 
SELECT 'E', 110 
)[Product] (Name, Weight) 
012:あなたはすべての製品を表示することがあり、すべての製品のために我々はそれが最も重いのですか、その後 CASE WHENDENSE_RANKが十分でなければなりませんかどうかを知る必要がある場合

SELECT TOP(1) WITH TIES Name, Weight 
FROM (
SELECT 'A', 100 UNION ALL 
SELECT 'B', 150 UNION ALL 
SELECT 'C', 25 UNION ALL 
SELECT 'D', 150 UNION ALL 
SELECT 'E', 110 
)[Product] (Name, Weight) 
ORDER BY Weight DESC 

または 2)

Demo