22,209
社区成员
发帖
与我相关
我的任务
分享
CREATE FUNCTION KSSJ_COMBINE
(@RQ DATE,@KSSJ DATETIME)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @CONTENT VARCHAR(8000)
SELECT @CONTENT=ISNULL(@CONTENT+',','')+ ','+mac_bh+' '+CAST(kssj AS VARCHAR(30))+' '+CAST(jssj AS VARCHAR(30))
FROM
(SELECT mac_bh,RQ,kssj,jssj FROM T1 GROUP BY mac_bh,RQ,kssj,jssj) AS A
WHERE RQ=@RQ AND DATEPART(HOUR,KSSJ)=DATEPART(HOUR,@KSSJ)
RETURN @CONTENT
END
调用函数
DECLARE @DATE VARCHAR(10)
DECLARE @SQL VARCHAR(8000)
SET @DATE='2019-12'
SELECT @SQL=ISNULL(@SQL+',','')+'MAX(CASE WHEN RQ='''+CAST(SINGLE_DAY AS VARCHAR(10))+'''THEN CONTENT ELSE '''' END) AS '''+CAST(SINGLE_DAY AS VARCHAR(10))+''''
FROM
((SELECT NUMBER,DATEADD(DAY,NUMBER,CAST(@DATE+'-01' AS DATE)) AS SINGLE_DAY
FROM MASTER.DBO.SPT_VALUES
WHERE TYPE='P'
AND NUMBER BETWEEN 0 AND DATEDIFF(DAY,CAST(@DATE+'-01' AS DATE),DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(@DATE+'-01' AS DATE)))))) AS A
SET @SQL=' SELECT A.NUMBER,B.*,CAST(A.NUMBER AS VARCHAR)+''-''+CAST(A.NUMBER+1 AS VARCHAR) AS TIME_RANGE
INTO #A
FROM MASTER.DBO.SPT_VALUES A
LEFT JOIN
(SELECT RQ ,DATEPART(HOUR,kssj) AS START_HOUR,
MAX(DBO.KSSJ_COMBINE(RQ,KSSJ)) AS CONTENT
FROM T1
GROUP BY RQ,DATEPART(HOUR,kssj)) AS B ON A.NUMBER=B.START_HOUR
WHERE TYPE=''P'' AND NUMBER<12
SELECT TIME_RANGE,'+@SQL+'
FROM #A
GROUP BY TIME_RANGE,NUMBER
ORDER BY NUMBER'
EXEC(@SQL)
DECLARE @DATE VARCHAR(10)
DECLARE @SQL VARCHAR(8000)
SET @DATE='2019-12'
;WITH CTE
AS
(SELECT NUMBER,DATEADD(DAY,NUMBER,CAST(@DATE+'-01' AS DATE)) AS SINGLE_DAY
FROM MASTER.DBO.SPT_VALUES
WHERE TYPE='P'
AND NUMBER BETWEEN 0 AND DATEDIFF(DAY,CAST(@DATE+'-01' AS DATE),DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(@DATE+'-01' AS DATE)))))
SELECT @SQL=ISNULL(@SQL+',','')+'['+CAST(SINGLE_DAY AS VARCHAR(10))+']'
FROM CTE
SET @SQL='WITH CTE
AS
(SELECT A.NUMBER,B.*,CAST(A.NUMBER AS VARCHAR)+''-''+CAST(A.NUMBER+1 AS VARCHAR) AS TIME_RANGE
FROM MASTER.DBO.SPT_VALUES A
LEFT JOIN
(SELECT RQ ,DATEPART(HOUR,kssj) AS START_HOUR,
MAX(CONTENT) AS CONTENT
FROM
(SELECT *,
STUFF((SELECT '',''+mac_bh+'' ''+CAST(kssj AS VARCHAR(30))+'' ''+CAST(jssj AS VARCHAR(30)) FROM #T WHERE A.RQ=RQ AND DATEPART(HOUR,KSSJ)=DATEPART(HOUR,A.KSSJ) FOR XML PATH('''')),1,1,'''') AS CONTENT
FROM #T AS A) AS B
GROUP BY RQ,DATEPART(HOUR,kssj)) AS B ON A.NUMBER=B.START_HOUR
WHERE TYPE=''P'' AND NUMBER<12)
SELECT TIME_RANGE,'+@SQL+' FROM CTE
PIVOT (MAX(CONTENT) FOR RQ IN('+@SQL+')) B
ORDER BY NUMBER'
EXEC(@SQL)