我可以在SQL Server 2012中使用SQL语句展平标题和详细信息记录吗
我有以下选择:我可以在SQL Server 2012中使用SQL语句展平标题和详细信息记录吗,sql,sql-server,Sql,Sql Server,我有以下选择: SELECT TOP 1000 [ObjectiveId] ,[Name] ,[Text] FROM [dbo].[Objective] 它给了我 Name Text 0100 Header1 0101 Detail1 0102 Detail2 0200 Header2 0201 Detail1a 0202 Detail1b 有没有办法从数据中用| | | |分隔符生成这样的字符串 Header1 |||
SELECT TOP 1000 [ObjectiveId]
,[Name]
,[Text]
FROM [dbo].[Objective]
它给了我
Name Text
0100 Header1
0101 Detail1
0102 Detail2
0200 Header2
0201 Detail1a
0202 Detail1b
有没有办法从数据中用| | | |分隔符生成这样的字符串
Header1 ||| Detail1
Header1 ||| Detail2
Header2 ||| Detail1a
Header2 ||| Detail1b etc.
这里的关键是,当name的最后两位数字为00时,它是以下详细信息行的标题行
; WITH headers AS (
SELECT Name
, Text
FROM dbo.Objective
WHERE Right(Name, 2) = '00'
)
, details AS (
SELECT Name
, Text
FROM dbo.Objective
WHERE Right(Name, 2) <> '00'
)
SELECT headers.Text + ' ||| ' + details.Text
FROM headers
LEFT
JOIN details
ON Left(details.name, 2) = Left(headers.name, 2)
编辑:忘记添加最后一行代码并使用正确的联接
编辑:忘记添加最后一行代码并使用正确的联接
;WITH Header
AS
(
SELECT LEFT([Name], 2) AS HeaderKey,
[Name],
[Text]
FROM Objective
WHERE RIGHT([Name], 2) = '00'
),
Detail
As
(
SELECT LEFT([Name], 2) AS HeaderKey,
[Name],
[Text]
FROM Objective
WHERE RIGHT([Name], 2) <> '00'
)
SELECT Header.[Text] + '|||' + Detail.[Text]
FROM Header
INNER JOIN Detail
ON Header.HeaderKey = Detail.HeaderKey
试试这个:
;WITH Header
AS
(
SELECT LEFT([Name], 2) AS HeaderKey,
[Name],
[Text]
FROM Objective
WHERE RIGHT([Name], 2) = '00'
),
Detail
As
(
SELECT LEFT([Name], 2) AS HeaderKey,
[Name],
[Text]
FROM Objective
WHERE RIGHT([Name], 2) <> '00'
)
SELECT Header.[Text] + '|||' + Detail.[Text]
FROM Header
INNER JOIN Detail
ON Header.HeaderKey = Detail.HeaderKey
查询:
结果:
| CLM |
------------------------
| Header1 ||| Detail1 |
| Header1 ||| Detail2 |
| Header2 ||| Detail1a |
| Header2 ||| Detail1b |
查询:
结果:
| CLM |
------------------------
| Header1 ||| Detail1 |
| Header1 ||| Detail2 |
| Header2 ||| Detail1a |
| Header2 ||| Detail1b |
首先,您应该真正使用连接语法。另外,当前的连接将返回Header1 | | | | header2之类的内容。您可以告诉我为什么这种格式不好,而不只是说连接。@Ejaz它是ANSI标准,当查询变得更复杂时,使用起来更容易。也更容易编写外部联接。关于这个主题的合理文章:@Ejaz在这个主题上发现了一个非常重要的问题:首先,你应该真正使用连接语法。另外,当前的连接将返回Header1 | | | | header2之类的内容。您可以告诉我为什么这种格式不好,而不只是说连接。@Ejaz它是ANSI标准,当查询变得更复杂时,使用起来更容易。也更容易编写外部联接。关于这一主题的合理文章:@Ejaz在这个主题上发现了一个很好的问题:对不起。也许我的问题不清楚。您的sql看起来不错,但它给出的是数字而不是文本。@Melina已更新,请立即尝试。只是交换了标题。名称+'| | |'+标题。名称到标题。文本+'| | |'+标题。Text@Melina你能澄清一下吗。怎么了?使用您的示例数据,这给出了正确的输出。我正在尝试检查它,但不断丢失互联网。很抱歉,问题是第一个查询中的数据有234行,当我运行您的查询时,数据超过1000行。应该小于234。对不起。也许我的问题不清楚。您的sql看起来不错,但它给出的是数字而不是文本。@Melina已更新,请立即尝试。只是交换了标题。名称+'| | |'+标题。名称到标题。文本+'| | |'+标题。Text@Melina你能澄清一下吗。怎么了?使用您的示例数据,这给出了正确的输出。我正在尝试检查它,但不断丢失互联网。很抱歉,问题是第一个查询中的数据有234行,当我运行您的查询时,数据超过1000行。它应该小于234。我的源行是234,但输出超过1000行。我的源行是234,但输出超过1000行。