私は現在、巨大なレポートに取り組んでおり、皮肉なことに何週間も取り組んできた重要な部分について助けが必要です
いくつかのことに基づいて数量を計算するレポートがありますが、「PREQuantity」列が null で、年の週 = 1 の場合、前年の 52 年の週から数量を取得します。ケース ステートメントは未完成です。わかっていますが、本質的には、前年度の第 52 週にプレクォンティについて強制するレポートが必要です。
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の提案に従って、この変更を加えました
,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
うまくいきませんでした
変更後