Sql server 选择使用程序所在的子句中设置的前10个值

Sql server 选择使用程序所在的子句中设置的前10个值,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在使用一个带有参数的过程:@TOP&@Bottom,这意味着当我在@TOP中键入例如50时,sql必须为我带来前50名的销售额 ALTER PROCEDURE [dbo].[SELL] @TOP int, @BOTTOM int AS SELECT E_REGION, E_LIBELLE, SUM(E_MONTANTTTC) as TOTAL VENTE, FROM SALE GROUP BY e_region, e_LIBELLE ORDER BY e_

我正在使用一个带有参数的过程:@TOP&@Bottom,这意味着当我在
@TOP
中键入例如50时,sql必须为我带来前50名的销售额

ALTER PROCEDURE [dbo].[SELL] @TOP int, @BOTTOM int AS

SELECT E_REGION, E_LIBELLE, SUM(E_MONTANTTTC) as TOTAL VENTE,

FROM SALE

GROUP BY    
    e_region, e_LIBELLE

     ORDER BY  e_region, e_MONTANTTTC desc

 EXEC [SELL] @TOP='', @BOTTOM='';
请在参数@top中键入N时,了解如何获取N top sales。 例:何时:@top=20
然后查询返回sql server中的前20名销售(e_montanttc)

,您可以使用set fetch next

select *
from tabla
order by 1
offset 0 rows fetch next 50 rows only;

偏移量是指当您开始并获取下一个寄存器编号时,如果您想要前50个,则偏移量为0,而获取下一个寄存器编号为50,如示例所示。

在注释中的对话之后,可以使用条件排序和
top
完成您要查找的内容。我已经修改了您当前的程序,并在其中添加了注释,以便于(希望)理解我所做的工作:

ALTER PROCEDURE [dbo].[SELL] 
(
    @TOP int, 
    @BOTTOM int 
)
AS
-- if both top and bottom have values, do nothing
IF @TOP IS NULL OR @BOTTOM IS NULL
BEGIN
    -- ABS: if @top or @bottom have a negative value, handle it as if it was positive
    -- COELASCE: if both @top and @bottom are null, get 0 rows back.
    SELECT TOP (ABS(COELASCE(@TOP, @BOTTOM, 0))) E_REGION, E_LIBELLE, SUM(E_MONTANTTTC) as TOTAL VENTE
    FROM SALE
    GROUP BY e_region, e_LIBELLE
    -- IIF: returns the second argument if the condition in the first argument is true, else the third argument
    ORDER BY IIF(@TOP IS NOT NULL, e_region, NULL), 
             IIF(@BOTTOM NOT IS NULL, e_region, NULL) DESC,
             IIF(@TOP IS NOT NULL, e_MONTANTTTC, NULL) DESC, 
             IIF(@BOTTOM IS NOT NULL, e_MONTANTTTC, NULL) 
END
然而,我认为不使用互斥的
@top
@bottom
参数更有意义,但它使用一个参数来设置返回的行数,一个参数来确定排序顺序-因此我也为您编写了这个版本(基本上,与第一个版本相比变化不大,并删除了注释):


提示:
TOP@TOP
Bottom应该做什么?@Bottom使用“Bottom”(最少N个元素)与TOP相反,您可以将TOP与ASC顺序一起使用。列名中也不允许使用空格:使用分隔符
[TOTAL VENTE]
或下划线
TOTAL\u VENTE
如果使用
EXEC,则最好选择后者[SELL]@TOP=10,@BOTTOM=5;
结果应该是什么?值得注意的是,
offset…fetch
是在2012版本中引入的。不幸的是,2008至今仍在使用,尽管它的扩展支持今年即将结束(如果内存可用的话)所以我可以在where子句中使用:offset 0 rows fetch next 50 rows only?您可以使用变量declare@a int=1 select*from tabla order by 1 offset 0 rows fetch next@a rows only;我不知道在where子句中的何处放置此代码?因此我可以设置如下条件:@top=offset 0 rows fetch next 50 rows only??只替换50对于@TOPThank的评论,我收到一条错误消息:IFF无法识别内置函数名。我正在使用SQL SERVER2008@HamzaSoufiane
IIF
于2012年推出。这是一种书写
case when…else…end
的简捷方法。在第一个示例中,我用
case…when
编辑了我的答案-我相信你可以n对第二个示例执行相同的操作。
ALTER PROCEDURE [dbo].[SELL] 
(
    @COUNT int, 
    @ASC bit 
)
AS

SELECT TOP (ABS(ISNULL(@COUNT, 0))) E_REGION, E_LIBELLE, SUM(E_MONTANTTTC) as TOTAL VENTE
FROM SALE
GROUP BY e_region, e_LIBELLE
ORDER BY IIF(@ASC = 1, e_region, NULL), 
         IIF(ISNULL(@ASC, 0) = 0, e_region, NULL) DESC,
         IIF(@ASC = 1, e_MONTANTTTC, NULL) DESC, 
         IIF(ISNULL(@ASC, 0) = 0, e_MONTANTTTC, NULL)