피벗 테이블에 대한 두 개의 다른 임시 테이블 사이의 전체 날짜 범위를 가져오고 싶습니다. 쿼리는 다음과 같습니다.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]
내가이 쿼리를 해결하기 위해 무엇을해야 뭔가? 대단히 감사합니다 :)
이것은 두 개의 숫자가 동일 할 가능성이 있습니다. 이것이 내 대답에서 (당신과 거의 동일합니다) 나는 group by 절을 추가 한 이유입니다. –
그래서이 문제에서 distinct를 사용하면 안되는 이유는 무엇입니까? 당신의 대답은 매력처럼 작동합니다 :). 우리 parml에서 뚜렷이 나올 때 기계공을 설명해 주시겠습니까? –
SQL Server에서는이 경우 'DISTINCT'를 허용하지 않습니다. SELECT DISTINCT가 지정되면 _ORDER BY 항목이 선택 목록에 나타나야합니다 ._ 오류 메시지가 표시됩니다. 'datelist'의 아이템이 반복되지 않도록 보장해야합니다. @FarisFajar가 제안한 것처럼'GROUP BY'를 추가하거나'# temp' 테이블을 채울 때'DISTINCT'를 사용하십시오 :'SELECT DISTINCT c.datelist INTO # temp' – Serge