2016-09-26 41 views
1

我需要一个表第2行(它将永远是2),并将它们合并成1列,因此,在表中的这些字段:转换2结果记录到1

BakeTime,直径,大小,高度

最终被类似

BakeTime1,BakeTime2,直径1,直径2,尺寸1,size2个,Height1,身高2

在最终结果记录中。表格中有一个“唯一ID”字段,这对于我一起输出的2条记录是唯一的。

+0

您需要标记您的dmbs,因为它对于答案很重要。 SQL服务器? MySQL的?甲骨文?窗口函数使事情变得简单。除非使用窗口函数,否则让我们知道表中的其他字段。 E..g主键和外键以及可能唯一的列(如时间戳)。 – Matt

+0

@Matt我用'tsql'标记了问题 – Conrad

+0

“Transact-SQL(T-SQL)是Microsoft和Sybase对SQL的专有扩展”https://en.wikipedia.org/wiki/Transact-SQL也是http:///堆栈溢出。问题/ 1301038 /什么是差异-t-sql-sql-server-and-sql我将它列为sql-server,但我们可以假设sql2012 +具有窗口函数吗? – Matt

回答

1

您应该可以使用内部联接从两条记录中生成单个行。根据你在关于标识列(CakeNo)的评论中的陈述,像下面这样的东西应该可以工作。

SELECT t1.BakeTime AS BakeTime1, t2.BakeTime as BakeTime2, t1.Diameter AS Diameter1, t2.Diameter AS Diameter2, 
     t1.Size AS Size1, t2.Size AS Size2, t1.Height AS Height1, t2.Height AS Height2 
FROM YourTable t1 
INNER JOIN YourTable t2 ON t2.UniqueId = t1.UniqueId AND t2.CakeNo != t1.CakeNo 
WHERE t1.UniqueId = 'YourIdHere' AND RIGHT(t1.CakeNo, 1) = 'A' 

免责声明:我不能完全肯定我理解你的CakeNo,左用(t1.CakeNo,1)= '1' 可能到位权是必要的(t1.CakeNo,1)='一个'。

+0

我不能认为“BakeTime”会有所不同 - 它们可能是一样的。 (即使它们不同,这个查询返回2行,每一对中的值反向为第2条记录) – Conrad

+0

@Conrad而不是比较BakeTime,也许你有一个创建的日期列或不同的东西或自动增量ID会区分1行和另一行?还要注意,这个查询可能会重复你的结果,第一行是#1,然后是第二行# – Matt

+0

@Conrad,你应该把CakeNo的解释放在你的问题中,它会澄清它很多。我更新了我的答案,以适应CakeNo,但认为它与你左派略有不同。无论如何,检查它是ROW_NUMBER()函数可用时更简单的方法之一。给你。 – Matt

0

因为你永远都只有两排尝试这样的事情

SELECT Concat(Min(baketime), ',', Max(baketime)), 
     Concat(Min(diameter), ',', Max(diameter)), 
     Concat(Min(size), ',', Max(size)), 
     Concat(Min(height), ',', Max(height)) 
FROM yourtable 

如果您使用的东西少SQL Server 2012然后用+运营商更换CONCAT来连接字符串

更新:看起来像你想要这个

SELECT Min(baketime), 
     Max(baketime), 
     Min(diameter), 
     Max(diameter), 
     Min(size), 
     Max(size), 
     Min(height), 
     Max(height) 
FROM yourtable 
+0

谢谢,但我需要的结果是离散的列。 – Conrad

+0

@Conrad - 立即检查 –

+2

@Prdp此查询不会将BakeTime1与Height1,Diameter1或Size1相关联。最小值和最大值可能不合适。 –

1

如果ID是不同的 - 不明确从你的问题

SELECT t1.*, t2.* // yes you need to alias actual column names 
FROM YourTable t1 
JOIN YourTable t2 
     ON t1.UniqueId = 1 // id1 
    AND t2.UniqueId = 2 // id2 

如果ID是相同的,CakeNo不同
马特借了很多(+1)

;WITH cte AS (
    SELECT * 
     , ROW_NUMBER() OVER (PARTITION BY uniqueID ORDER BY CakeNo) as RowNum 
    FROM 
     TableName 
    --where uniqueID = @ID -- in you only need one do it here 
) 

SELECT 
    c1.BakeTime as BakeTime1 
    ,c2.BakeTime as BakeTime2 
    ,c1.Diameter as Diameter1 
    ,c2.Diameter as Diameter2 
    ,c1.Size as Size1 
    ,c2.Size as Size2 
    ,c1.Height as Height1 
    ,c2.Height as Height2 
FROM 
    cte c1 
    left JOIN cte c2 -- in case only one row 
    ON c2.RowNum = 2 
    AND c1.RowNum = 1 

这个作品如果两个CakeNo是相同的
如果超过两行具有相同的ID,那么只会得到前两个

1
;WITH cte AS (
    SELECT 
     * 
     ,LEFT(CakeNo,LEN(CakeNo) - 1) as CorrelationId 
     ,ROW_NUMBER() OVER (PARTITION BY LEFT(CakeNo,LEN(CakeNo) - 1) ORDER BY CakeNo) as RowNum 
    FROM 
     TableName 
) 

SELECT 
    c1.BakeTime as BakeTime1 
    ,c2.BakeTime as BakeTime2 
    ,c1.Diameter as Diameter1 
    ,c2.Diameter as Diameter2 
    ,c1.Size as Size1 
    ,c2.Size as Size2 
    ,c1.Height as Height1 
    ,c2.Height as Height2 
FROM 
    cte c1 
    INNER JOIN cte c2 
    ON c1.CorrelationId = c2.CorrelationId 
    AND c2.RowNum = 2 
WHERE 
    c1.RowNum = 1 

根据您的评论,您可以从CakeNo的第一个字符派生出一个相关ID。因为我假设你会有超过9条记录,所以我想它就好像你从最终删除A/B到达你的CorrelationId。我已经更新了我的答案以反映这一点。