Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在SQL Server 2012中使用SQL语句展平标题和详细信息记录吗_Sql_Sql Server - Fatal编程技术网

我可以在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行。