Я хотел бы получить полный диапазон дат между двумя разными временными таблицами для сводной таблицы. Запрос выглядит так:XML-путь в порядковом номере SQL Server
DECLARE @cols AS NVARCHAR(MAX)
DECLARE @colswithNoNulls AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
DECLARE @tanggal_awal DATE
DECLARE @tanggal_akhir DATE
DECLARE @print NVARCHAR(MAX)
DECLARE @querycount AS NVARCHAR(MAX)
CREATE TABLE #datatable
(
product_id int,
product_date date,
product_ammount int
)
SET @tanggal_awal = convert(DATE,'02-01-2017')
SET @tanggal_akhir = convert(DATE,DATEADD(dd,-1,(DATEADD(mm,1,@tanggal_awal))))
INSERT INTO #datatable (product_id,product_date,product_ammount)
VALUES (1, GETDATE(), 100), (1, GETDATE(), 900),
(2, DATEADD(DD, -1, GETDATE()), 400),
(3, DATEADD(DD, 4, GETDATE()), 300),
(1, DATEADD(DD, 4, GETDATE()), 200),
(2, DATEADD(DD, 2, GETDATE()), 700),
(4, DATEADD(DD, -3, GETDATE()), 1000),
(4, DATEADD(MM, 1, GETDATE()), 200)
;WITH CTE (datelist,maxdate) AS
(
SELECT
CONVERT(INT, (MIN(DATEPART(day, @tanggal_awal)))) datelist,
CONVERT(INT, MAX(DATEPART(day, product_date))) maxdate
FROM
#datatable
UNION ALL
SELECT
CONVERT(INT, (DATEPART(day, datelist))),
CONVERT(INT, (DATEPART(day, @tanggal_akhir)))
FROM
cte
WHERE
datelist < maxdate
)
SELECT c.datelist
INTO #temp
FROM cte c
ORDER BY c.datelist
OPTION (maxrecursion 0)
SELECT * FROM #temp
SELECT
@cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(int, datelist))
FROM #temp
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
PRINT @cols
Однако результат не такой, как я ожидаю. Основываясь на результатах печати, он показывает что-то вроде этого:
[1],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[2],[20],[21],[22],[23],[24],[25],[26],[27],[28],[3],[4],[5],[6],[7],[8],[9]
В результате я хочу что-то вроде этого
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28]
Что я должен сделать, чтобы решить этот вопрос? Большое спасибо :)
У этого есть потенциал, чтобы произвести 2 числа, которые равны. Вот почему в моем ответе (это почти идентично вашему) я добавил предложение group by. –
, так почему я не должен использовать разные в этой проблеме? ваш ответ работает как шарм :). Можете ли вы объяснить мне механика, когда мы выделяемся в xml parh? –
В этом случае SQL Server не разрешит 'DISTINCT'. Если вы попробуете, вы получите элементы _ORDER BY, которые должны появиться в списке выбора, если указано SELECT DISTINCT. Сообщение об ошибке. Вы должны гарантировать, что элементы в 'datelist' не повторяются. Либо добавьте 'GROUP BY', как предложено @FarisFajar, либо используйте' DISTINCT' при заполнении таблицы '# temp':' SELECT DISTINCT c.datelist INTO # temp' – Serge