MS SQL Server-以特定方式连接
我有一个特殊的表,我需要使用类似子字符串的东西来连接它,但是要以一种特殊的方式。将会有很多空值,但我们仍然需要关注它们 基本上,我有点像MS SQL Server-以特定方式连接,sql,sql-server,substring,Sql,Sql Server,Substring,我有一个特殊的表,我需要使用类似子字符串的东西来连接它,但是要以一种特殊的方式。将会有很多空值,但我们仍然需要关注它们 基本上,我有点像 PID Date Flag1 Flag2 Code 11 01/01/2014 1 0 16 11 25/12/2014 1
PID Date Flag1 Flag2 Code
11 01/01/2014 1 0 16
11 25/12/2014 1 1 48
11 16/07/2016 0 1 9
12 07/01/2014 0 16
12 08/01/2014 1
12 09/01/2014 16
13 01/10/2014 1 4
13 01/11/2014 1 0 16
13 01/12/2014 0 48
会导致(很长)
这样,在我稍后使用的一些代码中,我将能够知道每个标志属于哪个日期
有什么想法吗?到目前为止,我一直在使用常规的子字符串命令,这些命令可以将内容放入正确的字段中,但我无法判断哪些内容属于哪些内容
SELECT DISTINCT PS2.PID, substring
((SELECT ',' + CAST(CONVERT(VARCHAR(10), PS1.Date, 111) AS NVARCHAR) AS [text()]
FROM dbo.PS PS1
WHERE PS1.PID = PS2.PID
ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Date], substring
((SELECT ',' + LEFT(CAST(LUC.Code AS NVARCHAR), 2) AS [text()]
FROM dbo.PS PS1 INNER JOIN
dbo.MyCodes LUC ON PS1.Code = LUC.Id
WHERE PS1.PID = PS2.PID
ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Code], substring
((SELECT ',' + LEFT(CAST(PS1.Flag1 AS NVARCHAR), 1) AS [text()]
FROM dbo.PS PS1
WHERE PS1.PID = PS2.PID
ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Flag1], substring
((SELECT ',' + LEFT(CAST(PS1.Flag2 AS NVARCHAR), 1) AS [text()]
FROM dbo.PS PS1
WHERE PS1.PID = PS2.PID
ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Flag2]
FROM dbo.PS PS2
还应注意,我们将始终有一个约会。这不会是空的。与PID相同(因为它们是按此分组的)。请尝试此操作,我已将日期列用作Edate,因此请将该列和表名替换为原始名称:
SELECT t1.PID,
STUFF(
(SELECT ',' + cast(EDate AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Edate,
STUFF(
(SELECT ',' + cast(Flag1 AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Flag1,
STUFF(
(SELECT ',' + cast(Flag2 AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Flag2,
STUFF(
(SELECT ',' + cast(Code AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Code
FROM #tmpone t1
GROUP BY t1.PID
SELECT t1.PID,
STUFF(
(SELECT ',' + cast(EDate AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Edate,
STUFF(
(SELECT ',' + cast(Flag1 AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Flag1,
STUFF(
(SELECT ',' + cast(Flag2 AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Flag2,
STUFF(
(SELECT ',' + cast(Code AS varchar)
FROM #tmpone t WHERE t.PID = t1.PID
FOR XML PATH(''))
, 1, 1, '') Code
FROM #tmpone t1
GROUP BY t1.PID