如何使用参数 select 使用哪个查询?
How to use a parameter to select which query to use?
我正在制作一份报告,我需要在此报告中显示在过去 2 年中销售额超过 5000 美元或在报告时销售额超过 500 美元的帐户 运行 .
DECLARE @Options INT = 1
--When I put 0 then
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
(PostDate BETWEEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND getdate())
GROUP BY Customer
HAVING SUM(Price) > 500
ORDER BY Customer
--When I put 1 then
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN DATEADD(Year,-2,GETDATE()) AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > 5000
ORDER BY Customer
一个简单的方法是将 "AND @Options = 0" 添加到第一个查询的 WHERE 子句中,将 "AND @Options = 1" 添加到第二个查询的 WHERE 子句中。然后通过在它们之间放置 UNION 将两个查询合并为一个。
用最简单的术语来说,就像这样:
IF @Options = 1
BEGIN
... query 1
END
ELSE
BEGIN
... query 2
END
ELSE
一种方法是使用 CASE
语句:
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN CASE @Options
WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
WHEN 1 THEN DATEADD(Year,-2,GETDATE())
ELSE NULL
END
AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > CASE @Options
WHEN 0 THEN 5000
WHEN 1 THEN 500
ELSE NULL
END
ORDER BY Customer;
这看起来不太漂亮,但应该可以工作(我可能留下了语法错误)。
另一种方法是声明变量并在查询中使用它们:
DECLARE @PriceTreshold INT = CASE @Options
WHEN 0 THEN 5000
WHEN 1 THEN 500
ELSE NULL
END;
DECLARE @PostDateFrom DATETIME2 = CASE @Options
WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
WHEN 1 THEN DATEADD(Year,-2,GETDATE())
ELSE NULL
END;
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN @PostDateFrom AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > @PriceTreshold
ORDER BY Customer;
您的查询并没有什么不同,它们只是基于 @Options
.
具有不同的过滤条件
如果它们真的那么不同,你可以使用这种语法:
IF @Options = 0
BEGIN
-- SQL query If @Options = 0
END
ELSE IF @Options = 1
BEGIN
-- SQL query If @Options = 1
END
但你的情况不需要这样做。
我正在制作一份报告,我需要在此报告中显示在过去 2 年中销售额超过 5000 美元或在报告时销售额超过 500 美元的帐户 运行 .
DECLARE @Options INT = 1
--When I put 0 then
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
(PostDate BETWEEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND getdate())
GROUP BY Customer
HAVING SUM(Price) > 500
ORDER BY Customer
--When I put 1 then
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN DATEADD(Year,-2,GETDATE()) AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > 5000
ORDER BY Customer
一个简单的方法是将 "AND @Options = 0" 添加到第一个查询的 WHERE 子句中,将 "AND @Options = 1" 添加到第二个查询的 WHERE 子句中。然后通过在它们之间放置 UNION 将两个查询合并为一个。
用最简单的术语来说,就像这样:
IF @Options = 1
BEGIN
... query 1
END
ELSE
BEGIN
... query 2
END
ELSE
一种方法是使用 CASE
语句:
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN CASE @Options
WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
WHEN 1 THEN DATEADD(Year,-2,GETDATE())
ELSE NULL
END
AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > CASE @Options
WHEN 0 THEN 5000
WHEN 1 THEN 500
ELSE NULL
END
ORDER BY Customer;
这看起来不太漂亮,但应该可以工作(我可能留下了语法错误)。
另一种方法是声明变量并在查询中使用它们:
DECLARE @PriceTreshold INT = CASE @Options
WHEN 0 THEN 5000
WHEN 1 THEN 500
ELSE NULL
END;
DECLARE @PostDateFrom DATETIME2 = CASE @Options
WHEN 0 THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
WHEN 1 THEN DATEADD(Year,-2,GETDATE())
ELSE NULL
END;
SELECT
Customer, SUM(Price) AS SALES
FROM
SOP30200 (NOLOCK)
WHERE
PostDate BETWEEN @PostDateFrom AND (GETDATE())
GROUP BY Customer
HAVING SUM(Price) > @PriceTreshold
ORDER BY Customer;
您的查询并没有什么不同,它们只是基于 @Options
.
如果它们真的那么不同,你可以使用这种语法:
IF @Options = 0
BEGIN
-- SQL query If @Options = 0
END
ELSE IF @Options = 1
BEGIN
-- SQL query If @Options = 1
END
但你的情况不需要这样做。