2016-05-24 9 views
1

Я хотел бы создать следующее:Суммы полученных образцов, сумма полученных образцов 7 дней назад, разница между двумя суммами с общим в нижней части колонны

Location Name Monday Last Monday Delta 
Location 2  90   92  -2 
Location 4  76   71  5 
Location 1  20   23  -3 
Location 3  15   13  2 
Total    201   199  2 

Из таблицы OrderInfo

ID LocationID DateReceived 
1  1    2016-05-23 
2  3    2016-05-23 
... 
100 1    2016-05-16 
101 4    2016-05-15 

с таблицей LocationInfo

ID LocationName 
1  Location 1 
2  Location 2 
3  Location 3 
4  Location 4 

код, который я до сих пор:

select 
case 
when grouping([LocationName]) = 1 
then 'Total' 
else [LocationName] 
end [LocationName], 
count(OrderInfo.LocationID) as Monday 
from OrderInfo 
left join LocationInfo 
on OrderInfo.LocationID = LocationInfo.LocationID 
where DateReceived = '2016-05-23' 
group by rollup(LocationInfo.LocationName) 
order by count(OrderInfo.LocationID) desc 

, который дает:

LocationName Monday 
Total   201 
Location 2  90 
Location 4  76 
Location 1  20 
Location 3  15 

Я могу повторить код замены «2016-05-23» с «2016-05-16», но не могу понять, как соединить два запроса, получить разницу между двумя запросами и упорядочить результаты с суммой в нижней части.

Мне также хотелось бы создать результаты с таким же форматом, но вместо этого поменять понедельник и последний понедельник на неделю и на последнюю неделю с даты и по месяцам и по последнему месяцу.

Любая помощь была бы принята с благодарностью.

+0

где DateReceived = «2016-05-23» вы хотите, чтобы данные только на этот день или целую неделю, т.е. с 16 по 23? –

ответ

0

Вот несколько вопросов, которые могут вам помочь. Я предполагаю, что данные существуют для всех местоположений в разные периоды времени.

1] Данные в понедельник и последний понедельник

SELECT 
    T1.[LocationName], 
    Monday, 
    LastMonday, 
    LastMonday-Monday AS [Difference] 
FROM 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as Monday 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived = '2016-05-23' 
GROUP BY ROLLUP(LI.LocationName) 
) AS T1 
LEFT JOIN 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as LastMonday 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived = '2016-05-16' 
GROUP BY ROLLUP(LI.LocationName) 
) AS T2 
ON T1.LocationName=T2.LocationName 
ORDER By T1.[LocationName] 

2] Данные недели до даты и на прошлой неделе Дата

DECLARE @LastWeekMonday DATE =DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) 
DECLARE @ThisWeekMonday DATE = DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0) 
DECLARE @CurrentDate DATE =GETDATE() 

--SELECT @LastWeekMonday,@ThisWeekMonday, @CurrentDate 


SELECT 
    T1.[LocationName], 
    WeekToDate, 
    LastWeekToDate, 
    LastWeekToDate-WeekToDate AS [Difference] 
FROM 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as WeekToDate 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived BETWEEN @ThisWeekMonday AND @CurrentDate 
GROUP BY ROLLUP(LI.LocationName) 
) AS T1 
LEFT JOIN 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as LastWeekToDate 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived BETWEEN @LastWeekMonday AND @CurrentDate 
GROUP BY ROLLUP(LI.LocationName) 
) AS T2 
ON T1.LocationName=T2.LocationName 
ORDER By T1.[LocationName] 

3] Данные за месяц до даты и в прошлом месяце Дата

DECLARE @LastMonthStart DATE =DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) 
DECLARE @CurrentMonthStart DATE = DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) 
DECLARE @CurrentDate DATE =GETDATE() 

SELECT @LastMonthStart,@CurrentMonthStart, @CurrentDate 


SELECT 
    T1.[LocationName], 
    MonthToDate, 
    LastMonthToDate, 
    LastMonthToDate-MonthToDate AS [Difference] 
FROM 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as MonthToDate 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived BETWEEN @CurrentMonthStart AND @CurrentDate 
GROUP BY ROLLUP(LI.LocationName) 
) AS T1 
LEFT JOIN 
(
SELECT 
    CASE 
    WHEN GROUPING([LocationName]) = 1 
    THEN 'Total' 
    ELSE [LocationName] 

    END [LocationName], 

    COUNT(OI.LocationID) as LastMonthToDate 

FROM OrderInfo AS OI 
LEFT JOIN LocationInfo AS LI 
ON OI.LocationID = LI.LocationID 
WHERE DateReceived BETWEEN @LastMonthStart AND @CurrentDate 
GROUP BY ROLLUP(LI.LocationName) 
) AS T2 
ON T1.LocationName=T2.LocationName 
ORDER By T1.[LocationName] 
+0

Если есть место с записями на 1-й понедельник, но не на 2-й понедельник, оно не будет показано. Итоги будут включать его, однако. 0 (или отсутствует) - это возможный счет –

0

Предполагая, что вы имеете в виду вы хотели бы отсчеты на целую неделю, ведущих к понедельникам:

--Start: get the number of days since monday 
DECLARE @dayname nvarchar(10) = DATENAME(dw,GETDATE()) 
     ,@dayscounter int = 0 
WHILE @dayname <> 'Monday' 
BEGIN 
    SET @dayscounter = @dayscounter + 1 
    SET @dayname = DATENAME(dw,DATEADD(dd,[email protected],GETDATE())) 
END 
--End: get the number of days since monday 
SELECT CASE WHEN (GROUPING(l.LocationName) = 1) THEN 'ALL' ELSE l.LocationName END 
     ,ISNULL(SUM(CASE WHEN [DataSet] = 1 THEN 1 END),0) AS Monday 
     ,ISNULL(SUM(CASE WHEN [DataSet] = 2 THEN 1 END),0) AS [Last Monday] 
     ,ISNULL(SUM(CASE WHEN [DataSet] = 1 THEN 1 END),0) 
     -ISNULL(SUM(CASE WHEN [DataSet] = 2 THEN 1 END),0) AS Delta 
FROM (--This is the data for a week since last Monday with 1 AS Dataset 
     --unioned with same for a week before that, 2 AS Dataset 
     SELECT [ID],[LocationID],[DateReceived],1 AS [Dataset] 
     FROM [MDSNordeaProd].[dbo].[OrderInfo] 
     WHERE [DateReceived] BETWEEN CONVERT(date, DATEADD(dd,-(@dayscounter+6),GETDATE())) 
      AND CONVERT(date, DATEADD(dd,[email protected],GETDATE())) 
     UNION 
     SELECT [ID],[LocationID],[DateReceived],2 AS [Dataset] 
     FROM [MDSNordeaProd].[dbo].[OrderInfo] 
     WHERE [DateReceived] BETWEEN CONVERT(date, DATEADD(dd,-(@dayscounter+14),GETDATE())) 
      AND CONVERT(date, DATEADD(dd,-(@dayscounter+7),GETDATE())) 
    )AS o 
INNER JOIN [LocationInfo] AS l ON o.LocationID=l.LocationID 
GROUP BY l.LocationName WITH ROLLUP 

Если вы хотите только отсчеты по понедельникам, то изменить условия, при которых в союзных частей, как это:

WHERE [DateReceived] = CONVERT(date, DATEADD(dd,[email protected],GETDATE())) 
WHERE [DateReceived] = CONVERT(date, DATEADD(dd,-(@dayscounter+7),GETDATE()))