与一年重叠的周数SQL [英] Weeks that overlap a year SQL

查看:192
本文介绍了与一年重叠的周数SQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在撰写一份庞大的报告,并且需要对我辛苦工作了几个星期的重要部分提供帮助

I'm currently working on a huge report and need some help on a vital part which I've been on for ironically weeks

我有一份报告可以计算基于几件事
的数量,但是我想做的是,当 PREQuantity列为空并且一年中的某周= 1时,然后从前一年
的第52周开始获得数量说明我知道还没有完成,但是本质上我需要在上一年的第52周强制执行

I have a report that calculates quantity based on a few things but what im trying to do is when the "PREQuantity" column is null and week of year = 1 then get quanitity from week of year 52 for the previous year the case statement is unfinished i know, but essentially i need the report to force in week 52 of the previous year for the prequantity

SELECT DR.DivNo
    ,p.[ProductCode]
    ,p.ProductClass
    ,p.EmpNo
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,dr.Retail
    ,bd.[Buying Director]
INTO #Product
FROM [PRODUCT] p
LEFT JOIN [DIVRETAIL] DR ON p.ProductCode = DR.ProductCode
LEFT JOIN vwAllBuyingDirectors bd ON p.EmpNo = bd.bd_BuyingDirector
WHERE dr.ValidTo IS NULL
    AND dr.DivNo NOT LIKE '8__'
GROUP BY DR.DivNo
    ,p.[ProductCode]
    ,p.ProductClass
    ,p.EmpNo
    ,bd.[Buying Director]
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,dr.Retail

    --select * from #Product

SELECT  [Datetime]
    ,[FirstDayOfWeek]
    ,[FirstDayOfMonth]
    ,c.YearWeek
    ,s.NoOfStores
    ,s.DivNo
INTO #stores
FROM [Calendar] c
LEFT JOIN Stores s ON c.FirstDayOfMonth = s.Validfrom
WHERE c.[Datetime] = firstdayofweek

--- GIVE STORE COUNT TO EACH DATETIME
SELECT s.DivNo
    ,c.[Datetime]
    ,c.WeekofYear
    ,c.FirstdayofWeek
    ,c.YearWeek
    ,s.NoOfStores
INTO #weeklystores
FROM .Calendar c
LEFT JOIN #stores s ON c.FirstDayOfWeek = s.FirstDayOfWeek
 -- Join numbers from #stores according to first day of week.  Each week onmly has the first day of the week's store count as a reference.

------------------------------------------PREVIOUS WEEK---------------------     --------------------
 SELECT  [Datetime]
    ,[FirstDayOflastWeek]
    ,[FirstDayOflastMonth]
    ,c.YearWeek
    ,s.NoOfStores
    ,s.DivNo
INTO #storesv2
FROM [Calendar] c
LEFT JOIN Stores s ON c.FirstDayOfMonth = s.Validfrom
WHERE c.[Datetime] = FirstDayOfWeek

--- GIVE STORE COUNT TO EACH DATETIME
SELECT s.DivNo
    ,c.[Datetime]
    ,c.WeekofYear
    ,c.FirstdayoflastWeek
    ,c.YearWeek
    ,s.NoOfStores
INTO #preweeklystores
FROM .Calendar c
LEFT JOIN #storesv2 s ON c.FirstDayOfWeek = s.FirstDayOfLastWeek    

/*
ASSIGN STORE COUNTS AND WEEK NUMBERS TO POS DATA
*/
    CREATE TABLE #salescore (
    [DivNo] NVARCHAR(max)
    ,[ProductCode] INT
    ,[Description] NVARCHAR(max)
    ,[CGNo] NVARCHAR(max)
    ,[SCGNo] NVARCHAR(max)
    ,Retail DECIMAL(38, 2)
    ,[WeekOfYear] TINYINT
    ,FirstDayOfWeek DATETIME
    ,[Quantity] INT
    ,[Sales] DECIMAL(38, 2)
    ,[NoOfStores] INT
    ,[USW] DECIMAL(38, 0)
    )

INSERT INTO #salescore
SELECT pos.DivNo
    ,pos.ProductCode
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,p.Retail
    ,w.WeekOfYear
    ,w.FirstDayOfWeek
    ,Sum(Quantity) [Quantity]
    ,sum(pos.Retail) [Retail2]
    ,w.NoOfStores
    ,(Sum(Quantity) / w.NoOfStores) USW
FROM .pos pos
LEFT JOIN #weeklystores w ON pos.PosDate = w.[DATETIME]
LEFT JOIN #Product p ON p.ProductCode = pos.ProductCode
    AND p.DivNo = pos.DivNo
    AND pos.DivNo = w.DivNo
WHERE pos.DivNo NOT LIKE '8__' /* Get rid of IRL Regions */
and w.YearWeek >2013
    and w.YearWeek IN (
        SELECT Item
        FROM DataWarehouse.dbo.ufnSplit(@YEAR, ',')
        )
    AND p.EmpNo IN (
        SELECT Item
        FROM ufnSplit(@BD, ',')
        )
    AND p.CGNo IN (
        SELECT Item
        FROM .ufnSplit(@CGNo, ',')
        )
    AND p.SCGNo IN (
        SELECT Item
        FROM ufnSplit(@SCGNo, ',')
        )
    AND p.ProductClass IN (
        SELECT Item
        FROM ufnSplit(@ProductClass, ',')
        )
    AND p.ProductCode IN (
        SELECT Item
        FROM ufnSplit(@ProductCode, ',')
        )
    AND pos.DivNo IN (
        SELECT Item
        FROM ufnSplit(@Region, ',')
        )
    AND w.WeekOfYear IN (
        SELECT Item
        FROM ufnSplit(@WOY, ',')
        )
    AND w.WeekOfYear IS NOT NULL /* Get rid of pos before goldthorp opening day */
GROUP BY pos.DivNo
    ,pos.ProductCode
    ,w.WeekOfYear
    ,w.NoOfStores
    ,w.FirstDayOfWeek
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,p.Retail


    ----------------------------------------PreviousWeekSales---------------------------------------------

        CREATE TABLE #presales (
    [DivNo] NVARCHAR(max)
    ,[ProductCode] INT
    ,[Description] NVARCHAR(max)
    ,[CGNo] NVARCHAR(max)
    ,[SCGNo] NVARCHAR(max)
    ,Retail DECIMAL(38, 2)
    ,PrevWOY TINYINT
    ,FirstDayOfWeek DATETIME
    ,[PreQuantity] INT
    ,[Sales] DECIMAL(38, 2)
    ,[NoOfStores] INT
    ,[USW] DECIMAL(38, 0)
    )

INSERT INTO #presales
SELECT pos.DivNo
    ,pos.ProductCode
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,p.Retail
    ,w.WeekOfYear as PrevWOY
    ,w.FirstDayOfLastWeek
    ,SUM(Quantity) Quantity
    ,sum(pos.Retail) [Retail3]
    ,w.NoOfStores
    ,(Sum(Quantity) / w.NoOfStores) USW
FROM .pos pos
LEFT JOIN #preweeklystores w ON pos.PosDate = w.[DATETIME]
LEFT JOIN #Product p ON p.ProductCode = pos.ProductCode
    AND p.DivNo = pos.DivNo
    AND pos.DivNo = w.DivNo
WHERE pos.DivNo NOT LIKE '8__' /* Get rid of IRL Regions */
and w.YearWeek >2013
    and w.YearWeek IN (
        SELECT Item
        FROM .ufnSplit(@YEAR, ',')
        )
    AND p.EmpNo IN (
        SELECT Item
        FROM ufnSplit(@BD, ',')
        )
    AND p.CGNo IN (
        SELECT Item
        FROM ufnSplit(@CGNo, ',')
        )
    AND p.SCGNo IN (
        SELECT Item
        FROM ufnSplit(@SCGNo, ',')
        )
    AND p.ProductClass IN (
        SELECT Item
        FROM ufnSplit(@ProductClass, ',')
        )
    AND p.ProductCode IN (
        SELECT Item
        FROM ufnSplit(@ProductCode, ',')
        )
    AND pos.DivNo IN (
        SELECT Item
        FROM ufnSplit(@Region, ',')
        )
    --AND w.WeekOfYear IN (
    --  SELECT Item
    --  FROM ufnSplit(@WOY, ',')
    --  )
    AND w.WeekOfYear IS NOT NULL /* Get rid of pos before goldthorp opening day */
GROUP BY pos.DivNo
    ,pos.ProductCode
    ,w.WeekOfYear
    ,w.NoOfStores
    ,w.FirstDayOfLastWeek
    ,[Description]
    ,[CGNo]
    ,[SCGNo]
    ,p.Retail



    CREATE TABLE #sales (
    [DivNo] NVARCHAR(max)
    ,[ProductCode] INT
    ,[Description] NVARCHAR(max)
    ,[CGNo] NVARCHAR(max)
    ,[SCGNo] NVARCHAR(max)
    ,Retail DECIMAL(38, 2)
    ,[WeekOfYear] TINYINT
    ,FirstDayOfWeek DATETIME
    ,[PreQuantity] int
    ,[Quantity] INT
    ,[Sales] DECIMAL(38, 2)
    ,[NoOfStores] INT
    ,[USW] DECIMAL(38, 0)
    ) 
    INSERT INTO #sales
    SELECT pos.DivNo
    ,pos.ProductCode
    ,p.Description
    ,p.CGNo
    ,p.SCGNo
    ,p.Retail
    ,pos.WeekOfYear
    ,pos.FirstDayOfWeek
    ,SUM(ps.PreQuantity)
    ,Sum(pos.Quantity) [Quantity]
    ,sum(pos.Sales) Sales
    ,pos.NoOfStores
    ,(Sum(pos.Quantity) / pos.NoOfStores) USW
FROM #salescore pos
LEFT JOIN #presales PS on (pos.WeekOfYear -1) = ps.PrevWOY and pos.ProductCode = ps.ProductCode and pos.DivNo= ps.DivNo

LEFT JOIN #Product p ON p.ProductCode = pos.ProductCode
    AND p.DivNo = pos.DivNo
WHERE pos.DivNo NOT LIKE '8__' /* Get rid of IRL Regions */
Group By
    pos.DivNo
    ,pos.ProductCode
    ,p.Description
    ,p.CGNo
    ,p.SCGNo
    ,p.Retail
    ,pos.WeekOfYear
    ,pos.FirstDayOfWeek
    ,pos.NoOfStores






SELECT *
FROM #Sales

ORDER BY 3 ASC

DROP TABLE #weeklystores
DROP TABLE #stores
DROP TABLE #storesv2
DROP TABLE #sales
DROP TABLE #Product
END

我做了这个根据@Abhay的建议进行更改

i made this change as suggested by @Abhay

 ,case when Sum(PreQuantity)= null and pos.WeekOfYear = 1 then (Select        Sum(PreQuantity) from #presales where WeekOfYear =52 and @year = @Year-1) else       SUM(PreQuantity) end as quantity


$ b结束$ b

它没有起作用

it didnt work

更改后

推荐答案

根据我的理解,我正在尝试完成您的个案声明:

I am trying to complete your case statement based on what I understand:

case when Sum(PreQuantity)= null and WeekOfYear = 1 then 
(Select Sum(Quantity)= null from Sometable a where a.WeekOfYear =52 and a.year = Year-1) 
else null end

注意:
假设您有一个列或可以导出年份的列

Note: Assuming you have a column or can derive a column for year

可能有很多表被连接

(年份)-1将从您最初的外部查询中得出,即

(Year)-1 will come from your original outer query i.e

FROM pos pos
LEFT JOIN #preweeklystores w ON pos.PosDate = w.[DATETIME]
LEFT JOIN #Product p ON p.ProductCode = pos.ProductCode
    AND p.DivNo = pos.DivNo
    AND pos.DivNo = w.DivNo
WHERE pos.DivNo NOT LIKE '8__' /* Get rid of IRL Regions */
and w.YearWeek >2013

如果您可以将别名用作表名作为每列的前缀,我将能够给出确切的查询。另外,您是否有日期/年份的列?

If you can use alias for tablename as prefix for each column, I would be able to give a exact query. Also, do you have a column for date/year?

这篇关于与一年重叠的周数SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆