Ich benutze SQL Server 2012. Und ich bin nicht in der Lage, ein kleines Problem zu lösen.Gruppierung mit Monat, Quartal, Halbjahr und Jahr funktioniert nicht richtig
Wenn das Tag "Half Year Total" angezeigt wird, ist das Feld "[HalfYear]" null und ich möchte es mit der rechten Hälfte des Jahres beschriften.
Jede Hilfe bitte! Dank
Dies ist der Code:
CREATE TABLE #tempDates (OrderDate DATETIME, SubTotal MONEY)
INSERT INTO #tempDates VALUES('2016-01-01', 10)
INSERT INTO #tempDates VALUES('2016-01-02', 10)
INSERT INTO #tempDates VALUES('2016-02-01', 15)
INSERT INTO #tempDates VALUES('2016-02-02', 15)
INSERT INTO #tempDates VALUES('2016-03-01', 20)
INSERT INTO #tempDates VALUES('2016-03-02', 20)
INSERT INTO #tempDates VALUES('2016-04-01', 10)
INSERT INTO #tempDates VALUES('2016-04-02', 10)
INSERT INTO #tempDates VALUES('2016-05-01', 15)
INSERT INTO #tempDates VALUES('2016-05-02', 15)
INSERT INTO #tempDates VALUES('2016-06-01', 20)
INSERT INTO #tempDates VALUES('2016-06-02', 20)
INSERT INTO #tempDates VALUES('2016-07-01', 10)
INSERT INTO #tempDates VALUES('2016-07-02', 10)
INSERT INTO #tempDates VALUES('2016-08-01', 15)
INSERT INTO #tempDates VALUES('2016-08-02', 15)
INSERT INTO #tempDates VALUES('2016-09-01', 20)
INSERT INTO #tempDates VALUES('2016-09-02', 20)
INSERT INTO #tempDates VALUES('2016-10-01', 10)
INSERT INTO #tempDates VALUES('2016-10-02', 10)
INSERT INTO #tempDates VALUES('2016-11-01', 15)
INSERT INTO #tempDates VALUES('2016-11-02', 15)
INSERT INTO #tempDates VALUES('2016-12-01', 20)
INSERT INTO #tempDates VALUES('2016-12-02', 20)
SELECT
CASE
--WHEN GROUPING(YEAR(OrderDate)) = 1 THEN 'Year Total'
WHEN GROUPING(
CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END
) = 1
THEN 'Year Total'
WHEN GROUPING(DATENAME(QUARTER, OrderDate)) = 1 THEN 'Half Year Total'
WHEN GROUPING(MONTH(OrderDate)) = 1 THEN 'Quarter Total'
ELSE ''
END AS TotalType,
MONTH(OrderDate) AS [Month],
DATENAME(QUARTER, OrderDate) AS [Quarter],
CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
--WHEN DATENAME(QUARTER, OrderDate) IS NULL THEN 'Half Total'
END AS [HalfYear],
YEAR(OrderDate) AS [Year],
SUM(SubTotal) as Purchases
FROM #tempDates
GROUP BY GROUPING SETS
(
(
MONTH(OrderDate),
DATENAME(QUARTER, OrderDate),
CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END,
YEAR(OrderDate)
),
(
DATENAME(QUARTER, OrderDate),
CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END,
YEAR(OrderDate)
),
(
CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END,
YEAR(OrderDate)
),
(Year(OrderDate))
)
ORDER BY
CASE
-- Month
WHEN
GROUPING(MONTH(OrderDate)) = 1 AND
GROUPING(DATENAME(QUARTER, OrderDate)) = 1 AND
GROUPING(CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END) = 1 AND
GROUPING(YEAR(OrderDate)) = 1 THEN '4'
-- Quarter
WHEN
GROUPING(MONTH(OrderDate)) = 0 AND
GROUPING(DATENAME(QUARTER, OrderDate)) = 1 AND
GROUPING(CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END) = 1 AND
GROUPING(YEAR(OrderDate)) = 1 THEN '3'
-- Half a year
WHEN
GROUPING(MONTH(OrderDate)) = 0 AND
GROUPING(DATENAME(QUARTER, OrderDate)) = 0 AND
GROUPING(CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END) = 1 AND
GROUPING(YEAR(OrderDate)) = 1 THEN '3'
-- Year
WHEN
GROUPING(MONTH(OrderDate)) = 0 AND
GROUPING(DATENAME(QUARTER, OrderDate)) = 0 AND
GROUPING(CASE
WHEN MONTH(OrderDate) <= 6 THEN 'H1'
WHEN MONTH(OrderDate) > 6 THEN 'H2'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) <= 2 THEN 'H1'
WHEN MONTH(OrderDate) IS NULL AND DATENAME(QUARTER, OrderDate) > 2 THEN 'H2'
END) = 0 AND
GROUPING(YEAR(OrderDate)) = 1 THEN '1'
ELSE
'0'
END
Warum sind Sie nicht einen Kalender Tabelle/Datumsdimension verwenden? [Erstellen einer Datumstabelle/Dimension in SQL Server 2008 - David Stein] (http://www.made2mentor.com/2011/06/creating-a-date-tableddimension-for-sql-server-2008/) und - [ Erstellen einer Datumsdimension oder einer Kalendertabelle in SQL Server - Aaron Bertrand] (https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/) – SqlZim
Entschuldigung, ich weiß das nicht und ich kenne Dimensionen nicht sehr gut. Brauche ich es, um mein Problem zu lösen? Die Abfrage hat nur ein sehr kleines Problem, zumindest sieht es so aus ... – MarcosF8