Sql server 选择使用程序所在的子句中设置的前10个值
我正在使用一个带有参数的过程:@TOP&@Bottom,这意味着当我在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
中键入例如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@HamzaSoufianeIIF
于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)