簡體   English   中英

在SQL中找到去年同一周的計數

[英]Find the count for last year same week in sql

我正在使用以下查詢,根據過去5-6周的日期從表中查找計數,如下所示

BEGIN
    SET datefirst 1;
    DECLARE @BeginDate datetime= '2016-10-10' 
    SELECT 
        count(*) as Total
      , datepart(wk, DateCreated) as WeekNumber
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104) as WeekStartDate
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104) as WeekEndDate
    FROM TABLESES
    WHERE   
        CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate) 
        AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate)
    GROUP BY      datepart(wk, DateCreated)
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104)
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104)
    ORDER BY datepart(wk, DateCreated)
END

這將返回如下結果集:

    Total   WeekNumber  WeekStartDate   WeekEndDate
    51295   36          29.08.2016      04.09.2016
    48133   37          05.09.2016      11.09.2016
    38991   38          12.09.2016      18.09.2016
    38074   39          19.09.2016      25.09.2016
    37192   40          26.09.2016      02.10.2016
    20835   41          03.10.2016      09.10.2016
    23781   42          10.10.2016      16.10.2016            

現在,我想在最后添加一列,以計算去年的同一周數。

我可以在查詢本身中達到相同的目的嗎? 還是應該為此編寫一個完全不同的查詢? 我該如何查詢?

您可以將UNIONDATEDIFF結合使用以獲取上一年的相同內容:

SELECT 
        count(*) as Total
      , datepart(wk, DateCreated) as WeekNumber
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104) as WeekStartDate
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104) as WeekEndDate
    FROM TABLESES
    WHERE   
        CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate) 
        AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate)
    GROUP BY      datepart(wk, DateCreated)
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104)
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104)
UNION ALL
SELECT 
        count(*) as Total
      , datepart(wk, DATEDIFF(year,1,DateCreated )) as WeekNumber
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DATEDIFF(year,1,DateCreated ))/7,0),104) as WeekStartDate
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DATEDIFF(year,1,DateCreated ))/7,6),104) as WeekEndDate
    FROM TABLESES
    WHERE   
        CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate) 
        AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate)
    GROUP BY      datepart(wk, DATEDIFF(year,1,DateCreated ))
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DATEDIFF(year,1,DateCreated ))/7,0),104)
      , convert(VARCHAR(20),dateadd(week,datediff(day,0,DATEDIFF(year,1,DateCreated ))/7,6),104)
    ORDER BY datepart(wk, DATEDIFF(year,1,DateCreated ))

將最終結果放入臨時表,然后執行以下操作:

請務必檢查上一年的日期邏輯。 但是希望您能理解。 我還沒有像我所寫的那樣測試過您的“版本”是否正確,但我希望您能明白。

測試版本的結果

在此處輸入圖片說明

測試版本:

DECLARE @Weeks1 TABLE(
Total int,
Weeknumber INT,
WeekStartDate nvarchar(50),
WeekEndDate nvarchar(50)
)

DECLARE @Weeks2 TABLE(
Total int,
Weeknumber INT,
WeekStartDate nvarchar(50),
WeekEndDate nvarchar(50) 
)


insert into @Weeks1 (Total,Weeknumber,WeekStartDate,Weekenddate)

values  ('51295', '36'        ,'29.08.2016'     ,'04.09.2016'),
    ('48133', '37'        ,'05.09.2016'     ,'11.09.2016'),
    ('38991', '38'        ,'12.09.2016'     ,'18.09.2016'),
    ('38074', '39'        ,'19.09.2016'     ,'25.09.2016'),
    ('37192', '40'        ,'26.09.2016'     ,'02.10.2016'),
    ('20835', '41'        ,'03.10.2016'     ,'09.10.2016'),
    ('23781', '42'        ,'10.10.2016'     ,'16.10.2016')


   insert into @Weeks2 (Total,Weeknumber,WeekStartDate,Weekenddate)

  values  ('324234', '36'       ,'29.08.2015'     ,'04.09.2015'),
    ('22333', '37'        ,'05.09.2015'     ,'11.09.2015'),
    ('23444', '38'        ,'12.09.2015'     ,'18.09.2015'),
    ('566666', '39'       ,'19.09.2015'     ,'25.09.2015'),
    ('4345', '40'         ,'26.09.2015'     ,'02.10.2015'),
    ('8657', '41'         ,'03.10.2015'     ,'09.10.2015'),
    ('8567567', '42'      ,'10.10.2015'     ,'16.10.2015')


Select a.Total,b.Total as 
LastYearTotal,a.Weeknumber,A.WeekStartDate,a.Weekenddate from @Weeks1 a 
inner join @Weeks2 b on a.Weeknumber = b.Weeknumber

與您的版本:

DECLARE @Weeks1 TABLE(
Total int,
Weeknumber INT,
WeekStartDate nvarchar(50),
WeekEndDate nvarchar(50)
)

DECLARE @Weeks2 TABLE(
Total int,
Weeknumber INT,
WeekStartDate nvarchar(50),
WeekEndDate nvarchar(50)
)


BEGIN
SET datefirst 1;
DECLARE @BeginDate datetime= '2016-10-10' 

insert into @Weeks1 (Total,Weeknumber,WeekStartDate,Weekenddate)

SELECT 
    count(*) as Total
  , datepart(wk, DateCreated) as WeekNumber
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104) as WeekStartDate
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104) as WeekEndDate
FROM TABLESES
WHERE   
    CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate) 
    AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate)
GROUP BY      datepart(wk, DateCreated)
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104)
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104)
ORDER BY datepart(wk, DateCreated)
END



BEGIN
SET datefirst 1;
DECLARE @BeginDate2 datetime= '2015-10-10' 

insert into @Weeks2 (Total,Weeknumber,WeekStartDate,Weekenddate)

SELECT 
    count(*) as Total
  , datepart(wk, DateCreated) as WeekNumber
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104) as WeekStartDate
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104) as WeekEndDate
FROM TABLESES
WHERE   
    CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate2) 
    AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate2)
GROUP BY      datepart(wk, DateCreated)
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104)
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104)
ORDER BY datepart(wk, DateCreated)
END


Select a.Total,b.Total as 
LastYearTotal,a.Weeknumber,A.WeekStartDate,a.Weekenddate from @Weeks1 a 
inner join @Weeks2 b on a.Weeknumber = b.Weeknumber

如果只需要幾周的時間,則可以先進行一些日期計算,並進行更簡單的查詢

SET datefirst 1;

 DECLARE @BeginDate datetime = '2016-10-10'; -- must be start of the week , <= last week -6
 declare @nweeks int = 6;
 -- this year interval
 declare @b1Date datetime = dateadd(week, -@nweeks , @BeginDate); --inclusive
 declare @e1Date datetime = dateadd(week, 1 , @BeginDate); -- exclusive
 declare @thisYear int = datepart(year, @b1Date);
 -- previous year interval
 declare @bwk int = datepart(week, @b1Date);
 declare @year2 datetime= dateadd(year,datediff(year,0,@b1Date)-1,0);
 declare @b2Date datetime = dateadd(week, @bwk-1, @year2);
 declare @e2Date datetime = dateadd(week, @bwk + @nweeks, @year2);
 -- check it
 select @BeginDate, @b1Date, @e1Date, @bwk,  @b2Date, @e2Date, datepart(week, @b2Date);

SELECT 
    count(case datepart(year, DateCreated) when @thisYear then 1 end) as TotalThisYear
  , datepart(wk, DateCreated) as WeekNumber
  , convert(VARCHAR(20),dateadd(week,datepart(week,DateCreated)-@bwk -1,@b1Date),104) as WeekStartDate
  , convert(VARCHAR(20),dateadd(day,7*(datepart(week,DateCreated)-@bwk-1)+6,@b1Date),104) as WeekEndDate
  , count(case datepart(year, DateCreated) when @thisYear-1 then 1 end) as TotalPrev
FROM TABLESES
WHERE   
    CONVERT(date,DateCreated) >= @b1Date AND CONVERT(date,DateCreated) <@e1Date
    OR
    CONVERT(date,DateCreated) >= @b2Date AND CONVERT(date,DateCreated) <@e2Date    
GROUP BY datepart(wk, DateCreated)
ORDER BY datepart(wk, DateCreated)

是的,您可以使用相同的查詢,但只需進行少量修改即可。 我已經使用了2個CTE,一個用於您的查詢,另一個用於前幾個星期。 然后將兩個都加入周號以獲取所需的最后一列,如下所示。

BEGIN  
SET datefirst 1;  
DECLARE @BeginDate datetime= '2016-10-10'  

;WITH CTE1 as
  SELECT 
    count(*) as Total  
  , datepart(wk, DateCreated) as WeekNumber  
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104) as WeekStartDate  
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104) as WeekEndDate  
FROM TABLESES  
WHERE     
    CONVERT(date,DateCreated) >= DATEADD(DAY, -42, @BeginDate)   
    AND CONVERT(date,DateCreated) <= DATEADD(DAY, 6, @BeginDate)  
GROUP BY      datepart(wk, DateCreated)  
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,0),104)  
  , convert(VARCHAR(20),dateadd(week,datediff(day,0,DateCreated )/7,6),104)    

,CTE2 as  
SELECT count(*) as Total    
    ,datepart(wk, dateadd(year, -1, DateCreated)) as WeekNumber  
 FROM TABLESES    
GROUP BY datepart(wk, dateadd(year, -1, DateCreated))  

SELECT CTE1.*, CTE2.Total  
FROM CTE1 JOIN CTE2  
ON CTE1.WeekNumber  = CTE2.WeekNumber  

  END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM