1

3 つの列を含む非常に単純なテーブルがあります。

ID  |  Orders | Code
--------------------
  1 |      11 |  'OK'
  2 |      25 | 'ER1'
  3 |       0 |  'OK'
  4 |      30 | 'ER2'
  5 |      42 |  'OK'

基準を満たす行を選択するストアド プロシージャを作成しようとしています。

私が必要とするのは、たとえば注文数が 10 未満または 30 を超える行を選択できるようにすることです。

したがって、私の手順へのサンプル呼び出しは次のようになります。

EXEC REPORT1 @code='OK', @orders0_10=1,@ordersMore30=1

これにより、行 3 と 5 が返されます。これまでの手順は次のとおりです。

CREATE PROCEDURE [dbo].[REPORT1]
(
@code NVARCHAR (5) = '',
@orders0_10 INT = 0,
@orders11_20 INT = 0,
@orders21_30 INT = 0,
@ordersMore30 INT = 0,
)
AS

SET NOCOUNT ON

SELECT TOP 1000
    ROW_NUMBER() OVER (ORDER BY RPT.Nr) AS Lp,
    RPT.ID,
    RPT.Orders,
    RPT.Code
FROM MyData RPT (NOLOCK)
WHERE (@code = '' OR RPT.Code= @code)
AND
--(
   (@orders0_10 = 1 AND RPT.Orders<= 10)
--OR (@orders11_20 = 1 AND (RPT.Orders > 10 AND RPT.Orders <= 20))
--OR (@orders21_30 = 1 AND (RPT.Orders > 20 AND RPT.Orders <= 30))
--OR (@ordersMore30 = 1 AND RPT.Orders > 30)
--)
ORDER BY RPT.Nr
GO

編集 必要なものを明確にしようとします。http://sqlfiddle.com/#!3/25045/19
のように基準を指定すると、2 行 (1,3) が得られますが、これは正しいことです。

これをhttp://sqlfiddle.com/#!3/25045/21に変更すると、 2 行 (2,4) も賭けますが、それは正しいです。

しかし、それらを次のように指定すると: http://sqlfiddle.com/#!3/25045/22以前の結果 (1,2,3,4) の結合を取得する必要があります:

売上が 10 または 20 未満の行

編集 私は最終的な作業バージョンを取得しました: http://sqlfiddle.com/#!3/25045/33、これが誰かに役立つことを願っています。

4

2 に答える 2

0

COALESCE「トリック」を使用できます。

SELECT 
    RPT.ID,
    RPT.Orders,
    RPT.Code
FROM MyData RPT 
WHERE COALESCE(@code, RPT.Code) = RPT.Code
AND   COALESCE(@orders0_10, RPT.Orders)   <= RPT.Orders
AND   COALESCE(@ordersMore30, RPT.Orders) >= RPT.Orders

デモ

于 2013-04-19T10:11:52.407 に答える