私はこれを、場所ごとに=「Ubicacion」というストアドプロシージャで実行しようとしています(固定資産の数= Ubicacionをカウントし、それらの資産の価値を合計し、それらの資産を減価償却する金額を合計します)現在その場所に配置されているアセットの場合。問題は、カーソルが一度しかフェッチしていないように見えることです
カーソルのクエリ:
SELECT DISTINCT (ubicacion) FROM
(SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) someAlias WHERE RowNum = 1
結果:
Ubicacion
----------
1114
4450
4353
3回取得する必要があります。「場所」のレコードごとに 1 つ、場所の最新のレコードのみ。
ALTER PROCEDURE [SISACT].[resume_activos]
AS
BEGIN
DECLARE @u CHAR(8);
DECLARE @p VARCHAR(8);
DECLARE @num_activos INT = 0;
DECLARE @monto_activos FLOAT = 0;
DECLARE @saldo_dep_activos FLOAT = 0;
DECLARE U CURSOR STATIC
FOR SELECT DISTINCT (ubicacion) FROM
(SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) someAlias WHERE RowNum = 1
OPEN U
FETCH NEXT FROM U INTO @u
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @num_activos = COUNT(a.Activo), @monto_activos = SUM(a.Costo_adquisicion), @saldo_dep_activos = SUM(a.Saldo_a_depreciar) FROM [SISACT].ACTIVOS_FIJOS a, [SISACT].UBICACIONES ub, (SELECT activo, ubicacion, Fecha_Ubicacion, row_number() OVER (
partition BY activo ORDER BY abs(datediff(dd, Fecha_Ubicacion, getdate()))
) AS RowNum FROM [SISACT].ACTIVO_UBICACION) ab WHERE RowNum = 1 AND ub.Ubicacion = @u AND a.Activo = ab.Activo AND ab.Ubicacion = @u
PRINT 'Ubicacion: ' +@u +' Num activos: ' + CONVERT(VARCHAR, @num_activos) + ' monto activos: ' + CONVERT(VARCHAR, @monto_activos) + ' saldo activos depreciados: '+ CONVERT(VARCHAR, @saldo_dep_activos)
FETCH NEXT FROM U INTO @u
END
CLOSE U
DEALLOCATE U
END
「印刷」ステートメントは、最初の場所と以前に言ったことの計算を含む「メッセージ」タブに一度だけ表示され、さらに何も返されません。このようなものを返したいと思います
Ubicacion | Num_Act | Monto_Act | Saldo_dep_Act
------------------------------------------------
4453 | 2 | 5787.65 | 332.247
私はT-SQLを初めて使用するので、本当にばかげた非常に間違ったことをしている場合はご容赦ください。以前にカーソルを使用してSPを実行しただけで、正常に機能しました(何も返されませんでした)。
私は何を間違っていますか?
前もって感謝します。