Я создал динамический SQL для решения этой конкретной проблемы. Можно настроить запрос, для которого YEAR
отображать в результате, а какой Column
для подсчета в разделе PIVOT
запроса. Формат даты в я использовал ниже запрос MM/DD/YYYY
.
Вы можете запустить код ЗДЕСЬ
Ниже приведен SQL-запрос.
CREATE TABLE SALESHS
( IDAREA INT,
DATEREG date NOT NULL,
IDPROD [NVARCHAR](50) NOT NULL
);
/* Insert rows into table 'SALESHS' */
INSERT INTO SALESHS
( IDAREA, DATEREG, IDPROD)
VALUES
( 1, '03/12/2019', 'xplpc'),
( 1, '03/15/2019', 'ndtlctm'),
( 2, '04/12/2019', 'wntd')
/* Create Calendar Table to capture all the dates for first day of month from start Date to end date */
CREATE TABLE Calendar
(
[CalendarDate] DATE
,[MonthName] AS FORMAT(CONVERT(DATE, DATEADD(m, DATEDIFF(m, 0, CalendarDate), 0)), 'MMM-yyyy')
,[MonthNo] AS FORMAT(CalendarDate,'MM')
,[Year] AS FORMAT(CalendarDate,'yyyy')
,DateKey AS CONCAT(FORMAT(CalendarDate,'yyyy'), FORMAT(CalendarDate,'MM'))
)
DECLARE @Date DATE, @StartDate DATE, @EndDate DATE
SET @Date = '01/01/2012'
SET @StartDate = CONVERT(DATE, DATEADD(m, DATEDIFF(m, 0, @Date), 0)) /* Set Start date to first day of the month for given date */
SET @EndDate = '04/01/2019'
WHILE @StartDate <= @EndDate
BEGIN
INSERT INTO Calendar (CalendarDate)
SELECT @StartDate
SET @StartDate = DATEADD(m, 1, @StartDate)
END
/* Variable to hold unique Months to be used in PIVOT clause */
DECLARE @UniqueMonthsToPivot NVARCHAR(MAX) = N''
/* Extract unique Month names with pivot formattings */
SELECT @UniqueMonthsToPivot = @UniqueMonthsToPivot + ', [' + COALESCE(MonthName, '') + ']'
FROM (SELECT DISTINCT MonthName FROM Calendar) DT
/* Remove first comma and space */
SELECT @UniqueMonthsToPivot = LTRIM(STUFF(@UniqueMonthsToPivot, 1, 1, ''))
/* Variable to hold pivot column names with alias to be used in SELECT Clause */
DECLARE @PivotMonthsToSelect NVARCHAR(MAX) = N''
/* Generate column names list for SELECT list with SUM Function and NULL handling.
YEAR in the where condition can be adjust to select and show only certain year or month in Select list.
Order by CalendarDate is important to define the sequence of columns in the result */
SELECT @PivotMonthsToSelect = @PivotMonthsToSelect + ', SUM(ISNULL([' + COALESCE(MonthName, '') + '], 0)) AS [' + MonthName + ']'
FROM Calendar WHERE Year >= 2012
Order by CalendarDate
/* Variable to hold t-sql query */
DECLARE @SQLStatement NVARCHAR(MAX) = N''
/* Generate dynamic PIVOT query here */
SET @SQLStatement =
N'SELECT IDAREA'
+ @PivotMonthsToSelect +
'FROM (
SELECT *
,CASE WHEN IDAREA IS NULL THEN 0 ELSE 1 END AS IDAREA_Dup
FROM Calendar C
LEFT JOIN SALESHS S ON C.CalendarDate = CONVERT(DATE, DATEADD(m, DATEDIFF(m, 0, DATEREG), 0))
) AA
PIVOT
( SUM(IDAREA_Dup)
FOR MonthName IN ('+ @UniqueMonthsToPivot +')
) P
WHERE IDAREA IS NOT NULL
GROUP BY IDAREA
'
/* Check the generated dynamic t-sql PIVOT query below */
--PRINT (@SQLStatement)
/* Execute the generated dynamic t-sql PIVOT query below */
EXEC (@SQLStatement)