Sql 列上的多个条件之间

Sql 列上的多个条件之间,sql,tsql,sql-server-2005,Sql,Tsql,Sql Server 2005,我有一个非常简单的表,包含3列: ID | Orders | Code -------------------- 1 | 11 | 'OK' 2 | 25 | 'ER1' 3 | 0 | 'OK' 4 | 30 | 'ER2' 5 | 42 | 'OK' 我正在尝试创建存储过程以选择符合我的标准的行: 我需要的是能够选择行,例如,少于10个订单或多于30个订单 因此,对我的过程的示例调用是: EXEC REPOR

我有一个非常简单的表,包含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
创建过程[dbo]。[REPORT1]
(
@代码NVARCHAR(5)='',
@订单0_10 INT=0,
@订单11_20 INT=0,
@订单21_30 INT=0,
@ordersMore30 INT=0,
)
作为
不计较
选择前1000名
(按RPT.Nr排序)上的行号()作为Lp,
RPT.ID,
RPT.命令,
RPT.代码
来自MyData RPT(NOLOCK)
其中(@code=''或RPT.code=@code)
及
--(
(@orders0_10=1和RPT.Orders 10和RPT.Orders 20和RPT.Orders 30)
--)
按RPT.Nr订购
去
编辑 我会尽力澄清我需要什么。
如果我像这里这样指定标准:我得到2行(1,3),这是正确的

如果我把它们改成这样:我还下注2行(2,4),这是正确的

但如果我这样指定它们:我应该得到先前结果的并集(1,2,3,4):

销售额小于10或20的行 编辑
我得到了最终的工作版本:,希望这对其他人有用。

您可以使用
合并
的“技巧”:

选择
RPT.ID,
RPT.命令,
RPT.代码
来自MyData RPT
其中COALESCE(@code,RPT.code)=RPT.code
和合并(@orders0_10,RPT.Orders)=RPT.Orders

您可以使用
合并
“技巧”:

选择
RPT.ID,
RPT.命令,
RPT.代码
来自MyData RPT
其中COALESCE(@code,RPT.code)=RPT.code
和合并(@orders0_10,RPT.Orders)=RPT.Orders
您的标准是:

where (@orders0_10 = 0 OR RPT.Orders<= 10) AND
      (@orders11_20 = 1 OR (RPT.Orders > 10 AND RPT.Orders <= 20)) AND
      (@orders21_30 = 1 OR (RPT.Orders > 20 AND RPT.Orders <= 30)) AND
      (@ordersMore30 = 1 OR RPT.Orders > 30)
你的标准是:

where (@orders0_10 = 0 OR RPT.Orders<= 10) AND
      (@orders11_20 = 1 OR (RPT.Orders > 10 AND RPT.Orders <= 20)) AND
      (@orders21_30 = 1 OR (RPT.Orders > 20 AND RPT.Orders <= 30)) AND
      (@ordersMore30 = 1 OR RPT.Orders > 30)

我不太明白你的意思,我想基于过程参数应用多个标准,所以如果我指定
@orders0\u 10=1
,我只需要带有ordersy的行,您的第一个查询带有注释,或者在您的情况下运行良好。你为什么要在更新中更改和?好的,你现在有了@TimSchmelter的答案。我不太明白你的意思,我想基于过程参数应用多个标准,所以如果我指定
@orders0\u 10=1
,我只想要带有orders的行第一次查询带有注释或在您的情况下运行良好。你为什么要在更新中更改和?好的,你现在有了@TimSchmelter的答案。谢谢你的帮助,但不幸的是,这不是我想要的结果。我已经编辑了我的问题,并添加了一些我应该获得的数据示例。感谢您的帮助,但不幸的是,这不是我想要得到的结果。我已经编辑了我的问题,并添加了一些我应该获得的数据样本。明白了!谢谢你的帮助,我只需要稍微改变一下就可以了明白了!谢谢你的帮助,我只需要稍微改变一下就可以了
where (@orders0_10 = 1 OR RPT.Orders<= 10) AND
      (@orders11_20 = 1 OR (RPT.Orders > 10 AND RPT.Orders <= 20)) AND
      (@orders21_30 = 1 OR (RPT.Orders > 20 AND RPT.Orders <= 30)) AND
      (@ordersMore30 = 1 OR RPT.Orders > 30)