Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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查询的帮助吗_Sql_Sql Server_Tsql - Fatal编程技术网

需要有关将相邻行合并为一行的SQL查询的帮助吗

需要有关将相邻行合并为一行的SQL查询的帮助吗,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要一个问题的解决方案,该问题的表结构如下所示。 输入 1 1/1/2009产品1 2/2/2009产品2 3/3/2009产品3 4/4/2009产品4 5/5/2009产品5 输出 1 1/1/2009 2/2009产品1 2 3/3/2009 4/4/2009产品3 3.5/5/2009产品5 我试着用CTE。但在提取第二行值时不是很成功。 谢谢你的帮助。谢谢。您正在寻找PIVOT: 这是你提供的信息的最佳照片,我在我的一个应用程序中做了类似的事情。如果数据透视值发生更改,则可能需要使用

我需要一个问题的解决方案,该问题的表结构如下所示。 输入

1 1/1/2009产品1 2/2/2009产品2 3/3/2009产品3 4/4/2009产品4 5/5/2009产品5

输出

1 1/1/2009 2/2009产品1 2 3/3/2009 4/4/2009产品3 3.5/5/2009产品5

我试着用CTE。但在提取第二行值时不是很成功。
谢谢你的帮助。谢谢。

您正在寻找PIVOT: 这是你提供的信息的最佳照片,我在我的一个应用程序中做了类似的事情。如果数据透视值发生更改,则可能需要使用动态SQL查询

SELECT *
    FROM (SELECT [Date]
        ,[Product] 
      FROM [Values]
   PIVOT (Max([Date])
          FOR [Product]
           IN ('put date ranges here')) pvt
这是我的样子,这将允许一组不同的值。这在表单生成器中用于检索用户输入的值

--//Get a comma delimited list of field names from the field table for this form
DECLARE @FieldNames varchar(max)
SELECT @FieldNames = COALESCE(@FieldNames + ', ', '') + '[' + CAST([FieldName] AS varchar(max)) + ']'
  FROM [Fields]
 WHERE [FormID] = @FormID

--//create a dynamic sql pivot table that will bring our 
--//fields and values together to look like a real sql table
DECLARE @SQL varchar(max)
SET @SQL = 
 'SELECT *
    FROM (SELECT [Values].[RowID]
            ,[Fields].[FieldName]
            ,[Values].[Value] 
            FROM [Values]
      INNER JOIN [Fields] ON [Fields].[FieldID] = [Values].[FieldID]
           WHERE [Fields].[FormID] = ''' + @FormID + ''') p
   PIVOT (Max([Value])
      FOR [FieldName]
      IN (' + @FieldNames + ')) pvt'

--//execute our sql to return the data
EXEC(@SQL)

我不知道罗斯的回答是否对你有帮助。这篇文章解释了如何向查询结果中添加行号。搜索行号以查找最可能的示例


一旦您有了一个正确编号行的查询,您应该能够将其放入CTE,然后从中选择两次-一次用于奇数,然后再次用于偶数。让每个结果返回偶数值以连接奇数-1=偶数。此时,您可以将查询结果合并在一起,并在一行上获得两个产品。

您实际上可以最初创建一个虚拟列并创建一个cte

然后,使用cte并在伪键和行号或模拟序列号的序列上连接它们

然后,在数据集中过滤以仅显示奇数行

create table dbo.test
(
    id integer,
    currdate varchar(20), -- just to keep simple, not to mess with dates, took this as string
    productCode varchar(20)
);


insert into test values (1, '1/1/2009', 'product1');
insert into test values (2, '2/2/2009', 'product2');
insert into test values (3, '3/3/2009', 'product3');
insert into test values (4, '4/4/2009', 'product4');
insert into test values (5, '5/5/2009', 'product5');


with ctes as
(
    select
        't' as joinKey,
        id, -- serves as rownum or else create another using row_num() over partition by and order by
        currdate,
        productCode     
    from test
)
select
    c1.id,
    c1.currdate,
    c1.productCode,
    c2.id,
    c2.currdate,
    c2.productCode
from
(
    select
        joinKey,
        id,
        currdate,
        productCode
    from
        ctes
)c1,
(
    select
        joinKey,
        id,
        currdate,
        productCode
    from
        ctes
)c2
where c1.joinKey = c2.joinKey
and c1.id + 1 = c2.id
and c1.id % 2 = 1
结果如下所示:

id  currdate    productCode id  currdate    productCode
1   1/1/2009    product1    2   2/2/2009    product2
3   3/3/2009    product3    4   4/4/2009    product4

谢谢你的指点,罗斯。我将尝试使用PIVOT操作符。我最终不得不使用CTEs,因为我已经有了一个只给出一半结果的查询。谢谢。返回的集合中有多少列?另外,在第3行中,第二个日期列缺失,可能是空值、空字符串,或者什么?返回的集合包含4列。是的,在第3行中,第二个日期列将为空,因为没有匹配的行用于组合日期值。我有一个查询,它使用CTE以及作为第一列生成的行号。我无法对输入表中的任何列进行分组。当我使用%2运算符时,查询仅返回偶数行。我们可能需要查看该查询以查看问题所在。我想把这个放在评论里是很粗糙的。为了进行比较,您需要x%2=0以及x%2=1。谢谢您的想法,John。这是我一直在研究的问题;在ProdListCTE为的情况下,选择按ProdTime asc追加订单的行号作为行id,ProdTime,Desc,从ProdListStaged插入到ProdList ProdTime1,ProdTime2,Desc从ProdListCTE A中选择A.ProdTime,B.ProdTime,A.Desc。行id=B.Row\U id-1I使用了两个CTE,一个用于奇数行,一个用于偶数行,并使用左外部联接进行选择。谢谢你,约翰。