主键上连接行值的SQL
我需要根据项ID连接查询中不同行中的值 例如,我有以下几行数据主键上连接行值的SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要根据项ID连接查询中不同行中的值 例如,我有以下几行数据 GroupID LABEL VALUE UNIT 1 Name Henry 1 Guest Manny Guest 1 Room 12 1 Milk 10 Quart 1 Eggs 3 dozen 2 Name Mark Supervisor 2 Water 13
GroupID LABEL VALUE UNIT
1 Name Henry
1 Guest Manny Guest
1 Room 12
1 Milk 10 Quart
1 Eggs 3 dozen
2 Name Mark Supervisor
2 Water 13 Litre
2 Milk 3 Gallons
2 Soap 12 bars
作为输出,我想得到以下结果
ItemID VALUE
1 Name: Henry; Guest:Manny Guest; Room:12; Milk:10 Quart; Eggs: 3 dozen;
2 Name: Mark supervisor; Water: 13 litre; Milk: 3 Gallons; Soap: 12 bars;
请问我该如何做到这一点 您可以基于()编写递归查询 -它现在包括处理UNIT列中空值的代码
WITH PRE
AS (SELECT *,
Row_number()
OVER (
PARTITION BY GROUPID
ORDER BY GROUPID) RN
FROM TABLE1),
RECURSIVE
AS (SELECT *,
Cast(LABEL + ':' + VALUE + ' ' + Isnull(UNIT, '') + ';' AS
VARCHAR(
MAX))
AS FINAL
FROM PRE
WHERE RN = 1
UNION ALL
SELECT t1.*,
FINAL
+ Cast(t1.LABEL +':' + t1.VALUE +' '+ Isnull(t1.UNIT, '') + ';'
AS
VARCHAR(MAX))
FROM PRE T1
INNER JOIN RECURSIVE T2
ON T1.GROUPID = T2.GROUPID
AND T1.RN = T2.RN + 1)
SELECT T1.GROUPID,
T1.FINAL
FROM RECURSIVE T1
INNER JOIN (SELECT Max(RN) RN,
GROUPID
FROM RECURSIVE
GROUP BY GROUPID) T2
ON T1.GROUPID = T2.GROUPID
AND t1.RN = T2.RN
请尝试:
SELECT DISTINCT a.GroupID AS ItemID,(
SELECT ISNULL(b.LABEL,'')+': '+ISNULL(b.VALUE,'')+' '+ISNULL(b.UNIT,'')+';' FROM TABLE b WHERE b.GroupID=a.GroupID
FOR XML PATH('')) AS [VALUE]
FROM TABLE a
看看这个,有很多方法可以解决它
Declare @t TABLE
(
GroupID INT,
Label NVARCHAR(20),
Value NVARCHAR(20),
Unit NVARCHAR (50)
)
INSERT INTO @t
VALUES (1,'Name','Henry','')
,(1,'Guest','Manny','Guest')
,(1,'Room','12','')
,(1,'Milk','10','Quart')
,(1,'Eggs','3','dozen')
,(2,'Name','Mark','Supervisor')
,(2,'Water','13','Litre')
,(2,'Milk','3','Gallons')
,(2,'Soap','12','bars')
;With Cte As
(
Select
GroupId
,Label = Label + ': ' + Value + ' ' + Unit
From @t
)
Select
GroupId
,Value = Stuff((Select ';' + Cast(Label As Varchar(Max))
From Cte c2
Where c1.GroupId = c2.GroupId
For Xml Path('')),1,1,'')+';'
From Cte c1
Group By c1.GroupId
还应注意堆栈溢出的原因完全工作的exmaple:
SET NOCOUNT ON
GO
DECLARE @SourceTable TABLE
(
GroupID INT,
LABEL NVARCHAR(20),
VALUE NVARCHAR(20),
UNIT NVARCHAR (50)
)
INSERT INTO @SourceTable (GroupID,LABEL,VALUE,UNIT)
VALUES (1,'Name','Henry','')
,(1,'Guest','Manny','Guest')
,(1,'Room','12','')
,(1,'Milk','10','Quart')
,(1,'Eggs','3','dozen')
,(2,'Name','Mark','Supervisor')
,(2,'Water','13','Litre')
,(2,'Milk','3','Gallons')
,(2,'Soap','12','bars')
SELECT DISTINCT GroupID
,(SELECT SUBSTRING((SELECT ';' + LABEL +':'+VALUE+' '+UNIT FROM @SourceTable AS B WHERE A.GroupID=B.GroupID FOR XML PATH('')),2,200) AS CSV)
FROM @SourceTable AS A
SET NOCOUNT OFF
GO
+感谢你做了我决定要做的事。太使用XML是解决这个问题的最快、最简单的方法。我也尝试过这个例子,但我没有得到任何值,而事实上我的表中有很多值要编译。当我尝试使用左联接将表联接到另一个表时,就会发生这种情况。是否有针对这一点的规则,或者这可能是我这边的错误?我认为这是因为列标签或值或单位中的空值,请尝试添加
ISNULL(b.Label',)
而不是b.Label
等。谢谢。我能够利用联合来解决我的问题。我得到了一些奇怪的结果。我尝试了这个方法,但没有得到任何结果,事实上,我的表中至少有12行包含连接值?它使用您在Q中发布的数据,并根据您的要求给出结果。你使用的数据有很大的不同吗?是的,我看了小提琴的例子。在我刚刚注意到的错误之后,似乎不允许我在递归方法中进行左连接。这似乎就是我没有得到任何东西的原因。如果房间
行的单位
列(或姓名Henry
行)中的空值实际上是NULL
,您可能需要添加ISNULLs或coalises来解决这个问题。非常感谢。我又拿到了我的SQL黑客书籍。在从事了多年的基本CRUD项目之后,需要重新认真地用SQL编码。