2016-05-24 5 views
1

Ich möchte folgendes erstellen:Summe der Proben erhalten, die Summe der Proben erhielten 7 Tage vor Differenz zwischen beiden Summen mit insgesamt im unteren Bereich der Säule

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 

aus einer Tabelle Order

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

Mit einem Tisch LocationInfo

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

-Code ich habe bisher:

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 

die gibt:

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

I ersetzt, ‚2016.05.23‘ mit ‚2016.05.16‘ kann aber nicht herausfinden, wie kommen Sie mit den beiden Abfragen wiederholen Sie den Code Ermitteln Sie den Unterschied zwischen den beiden Abfragen und sortieren Sie die Ergebnisse mit dem Gesamtwert nach unten.

Ich möchte auch Ergebnisse mit dem gleichen Format erstellen, aber ersetzen Montag und letzten Montag mit der aktuellen und letzten Woche und eine für den Monat bis zum letzten Monat und bis zum aktuellen Datum.

Jede Hilfe würde sehr geschätzt werden.

+0

wo DateReceived = ‚2016.05.23‘ wollen Sie die Daten einfach nur für diesen Tag oder die ganze Woche, das heißt vom 16. bis zum 23.? –

Antwort

0

Hier sind verschiedene Fragen, die Ihnen helfen können. Ich nehme an, dass Daten für alle Orte über verschiedene Zeiträume hinweg existieren.

1] Daten für Montag und letzter Montag

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] Daten für Woche Datum und letzte Woche Datum

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] Daten für Monat und Datum der letzten Monat an Datum

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

Wenn es einen Ort mit Datensätzen für den ersten Montag, aber nicht für den zweiten Montag gibt, wird er nicht angezeigt. Die Summen werden es jedoch enthalten. 0 (oder fehlt) ist eine mögliche Anzahl –

0

Unter der Annahme, dass Sie meinen Sie die Zählungen für die ganze Woche auf den Montag führenden möchten:

--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 

Wenn Sie nur die Zählungen wollen montag dann wie folgt die WHERE-Bedingungen in der Union Teilen ändern:

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