我需要一个表第2行(它将永远是2),并将它们合并成1列,因此,在表中的这些字段:转换2结果记录到1
BakeTime,直径,大小,高度
最终被类似
BakeTime1,BakeTime2,直径1,直径2,尺寸1,size2个,Height1,身高2
在最终结果记录中。表格中有一个“唯一ID”字段,这对于我一起输出的2条记录是唯一的。
我需要一个表第2行(它将永远是2),并将它们合并成1列,因此,在表中的这些字段:转换2结果记录到1
BakeTime,直径,大小,高度
最终被类似
BakeTime1,BakeTime2,直径1,直径2,尺寸1,size2个,Height1,身高2
在最终结果记录中。表格中有一个“唯一ID”字段,这对于我一起输出的2条记录是唯一的。
您应该可以使用内部联接从两条记录中生成单个行。根据你在关于标识列(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)='一个'。
因为你永远都只有两排尝试这样的事情
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
谢谢,但我需要的结果是离散的列。 – Conrad
@Conrad - 立即检查 –
@Prdp此查询不会将BakeTime1与Height1,Diameter1或Size1相关联。最小值和最大值可能不合适。 –
如果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,那么只会得到前两个
;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。我已经更新了我的答案以反映这一点。
您需要标记您的dmbs,因为它对于答案很重要。 SQL服务器? MySQL的?甲骨文?窗口函数使事情变得简单。除非使用窗口函数,否则让我们知道表中的其他字段。 E..g主键和外键以及可能唯一的列(如时间戳)。 – Matt
@Matt我用'tsql'标记了问题 – Conrad
“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