6

Microsoft SQL ServerManager2008を使用します。

「最終的に」パレートリストのトップ10を選択するストアドプロシージャを作成します。しかし、これをもう一度実行して、下位10を見つけたいと思います。

ここで、クエリをもう一度複製するのではなく、ascからdescに順序を変更するパラメータをクエリに渡す方法があるかどうかを確認しようとしています。

コードの複製から私を救うこれを行う方法はありますか?

CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto ORDER by Pareto @orderby
4

4 に答える 4

10

少しばかげているだけで:

CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto
ORDER by CASE WHEN @orderby='ASC' THEN Pareto END,
         CASE WHEN @orderby='DESC' THEN Pareto END DESC

2番目の並べ替え条件を式に厳密に入れる必要はまったくありませんCASE(*)。Pareto数値の場合は、そのままにすることもできますCASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

(*) 2 番目の並べ替え条件は、最初の並べ替え条件で 2 つの行が等しいと見なされた場合にのみ効果があります。これは、両方の行が同じPareto値を持っている場合 (つまり、逆の並べ替えでも等しいと見なされる)、または最初のCASE式が s を返すNULLため (そう@orderbyではない'ASC'ため、並べ替えを実行したい場合) のいずれかですDESC


また、2 つの呼び出しを行うのではなく、両方の結果セットを一度に取得することを検討することもできます。

CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS

SELECT * FROM (
    SELECT
       *,
       ROW_NUMBER() OVER (ORDER BY Pareto) as rn1,
       ROW_NUMBER() OVER (ORDER BY Pareto DESC) as rn2
    FROM (
        SELECT Peroid1.Pareto
        FROM dbo.Peroid1
        GROUP by Pareto
    ) t
) t2
WHERE rn1 between 1 and 10 or rn2 between 1 and 10
ORDER BY rn1

これにより、上位 10 件と下位 10 件が上から順に表示されます。ただし、結果が合計で 20 件未満の場合、現在のプランとは異なり、重複することはありません。

于 2012-09-13T13:22:03.343 に答える
1

試す:

 CREATE PROCEDURE [dbo].[TopVRM]
(@orderby varchar(255)
AS
IF @orderby='asc'
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto ORDER by Pareto asc
ELSE
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto ORDER by Pareto desc
于 2012-09-13T13:21:47.057 に答える
0

これにより、より多くのオプションが提供されます

CREATE PROCEDURE [dbo].[TopVRM] @orderby varchar(255) = 'Pareto asc'
DECLARE @SendIt NVARCHAR(MAX)
AS
BEGIN
    SET @SendIt = 'SELECT Peroid1.Pareto FROM dbo.Peroid1
                   GROUP by Pareto ORDER by '+ @orderby
    EXEC sp_executesql @SendIt
END
GO
EXEC dbo.TopVRM 'Pareto DESC'
GO
于 2021-12-16T10:25:28.630 に答える