如何多次循环SQL语句

gre*_*121 0 sql t-sql sql-server

我尝试多次循环一个sql语句来检索特定商店的每周收入.这是我最好的猜测不起作用.

SELECT * 
    DECLARE @i int = 0
    WHILE @i < 52 BEGIN
        SET @i = @i + 1
        FROM dbo.revenue
        WHERE DATEPART(WW, date) = @i
        AND storenumber = '005'
    END
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 5

你实际上从不想在SQL中编写循环.

SELECT
  SUM(earnings) weekly_earnings
FROM
  dbo.revenue
WHERE
  storenumber = '005'
  AND date >= '2015-01-01'
  AND date < '2016-01-01'
GROUP BY
  DATEPART(WW, date)
Run Code Online (Sandbox Code Playgroud)

左对联包含52行(1到52)的帮助表,表示填充空白的周数(没有收入的周数).

请注意,date >= '2015-01-01' AND date < '2016-01-01'因为:

  • 您必须将查询限制为一年,否则周数变得模糊不清
  • 它优于DATEPART(YY, date) = 2015因为,作为计算,表达式将无法在date列上使用索引,>=而且<可以使用索引

编辑:您可以在SQL Server上使用递归CTE而不是临时表:

WITH WeekNumbers (WkNum) AS (
  SELECT 1 AS WkNum
  UNION ALL
  SELECT w.WkNum + 1 FROM WeekNumbers w WHERE w.WkNum <= 52
)
SELECT
  w.WkNum,
  SUM(r.earnings) weekly_earnings
FROM
  WeekNumbers w
  LEFT JOIN dbo.revenue r ON w.WkNum = DATEPART(WW, r.date) 
WHERE
  r.storenumber = '005'
  AND r.date >= '2015-01-01'
  AND r.date < '2016-01-01'
GROUP BY
  w.WkNum
Run Code Online (Sandbox Code Playgroud)

  • @ greg121是的,基于集合的方法需要一些人习惯,但学习它绝对是不可避免的. (2认同)