Sql 获取两列的不同值并合并到行中

Sql 获取两列的不同值并合并到行中,sql,sql-server,Sql,Sql Server,我有一个名为dbo.WebsiteIP的表,它有两列IPAddress,SiteName,我正在批量插入此表的值,如下所示 IPAddress SiteName 192.168.30.6 website1.domain.com 192.168.30.6 website2.domain.com 192.168.30.7 website3.domain.com 192.168.30.7 website4.domain.com 192.168.30.7 web

我有一个名为
dbo.WebsiteIP
的表,它有两列
IPAddress
SiteName
,我正在批量插入此表的值,如下所示

IPAddress       SiteName
192.168.30.6    website1.domain.com
192.168.30.6    website2.domain.com
192.168.30.7    website3.domain.com
192.168.30.7    website4.domain.com
192.168.30.7    website5.domain.com
192.168.30.7    website6.domain.com
192.168.30.7    website7.domain.com
192.168.30.8    website8.domain.com
192.168.30.8    website9.domain.com
192.168.30.8    website10.domain.com
192.168.30.8    website11.domain.com
192.168.30.9    website12.domain.com
192.168.30.8    website13.domain.com
192.168.30.8    website14.domain.com
192.168.30.24   website15.domain.com
192.168.30.8    website16.domain.com
192.168.30.8    website17.domain.com
IPAddress       WebsiteName 
192.168.30.6    website1, website2,
192.168.30.7    website3, website4, website5, website6, website7
192.168.30.8    website8, website9, website10, website11, website13, website14
192.168.30.9    website12
192.168.30.24   website15
我想对IP地址进行一个独特的查询,并将
SiteName
组合起来,如下所示

IPAddress       SiteName
192.168.30.6    website1.domain.com
192.168.30.6    website2.domain.com
192.168.30.7    website3.domain.com
192.168.30.7    website4.domain.com
192.168.30.7    website5.domain.com
192.168.30.7    website6.domain.com
192.168.30.7    website7.domain.com
192.168.30.8    website8.domain.com
192.168.30.8    website9.domain.com
192.168.30.8    website10.domain.com
192.168.30.8    website11.domain.com
192.168.30.9    website12.domain.com
192.168.30.8    website13.domain.com
192.168.30.8    website14.domain.com
192.168.30.24   website15.domain.com
192.168.30.8    website16.domain.com
192.168.30.8    website17.domain.com
IPAddress       WebsiteName 
192.168.30.6    website1, website2,
192.168.30.7    website3, website4, website5, website6, website7
192.168.30.8    website8, website9, website10, website11, website13, website14
192.168.30.9    website12
192.168.30.24   website15
我可以使用下面的查询组合
IPAddress
,但是如何将适当的
Sitename
组合到IP地址。

Update Table1
Set IP= (Select IPAddress + ',' + ' '
From dbo.WebsiteIP
GROUP BY IPAddress FOR XML PATH(''))
GO

请使用下面的查询

update Table1 T1 set IP = T2.SiteName
from
(select IPAddress, string_agg(SiteName, '') as SiteName from dbo.WebsiteIP 
) T2
where T2.IPAddress =  T1.IPAddress;

请使用下面的查询

update Table1 T1 set IP = T2.SiteName
from
(select IPAddress, string_agg(SiteName, '') as SiteName from dbo.WebsiteIP 
) T2
where T2.IPAddress =  T1.IPAddress;

正确的答案是修复数据模式

为了得到想要的结果,你可以

SELECT T.IpAddress,
       STUFF(
              (
                SELECT ',' + LEFT(WebsiteName, CHARINDEX('.', WebsiteName)-1)
                FROM Data TT
                WHERE TT.IpAddress = T.IpAddress
                FOR XML PATH('')
              )
              , 1, 1, ''
            ) Result
FROM Data T
GROUP BY T.IpAddress;

正确的答案是修复数据模式

为了得到想要的结果,你可以

SELECT T.IpAddress,
       STUFF(
              (
                SELECT ',' + LEFT(WebsiteName, CHARINDEX('.', WebsiteName)-1)
                FROM Data TT
                WHERE TT.IpAddress = T.IpAddress
                FOR XML PATH('')
              )
              , 1, 1, ''
            ) Result
FROM Data T
GROUP BY T.IpAddress;

您可以通过使用
工具来实现这一点

DECLARE @T Table(
IP VARCHAR(MAX),
WEBSITE VARCHAR(MAX))


INSERT INTO @T VALUES('192.168.30.6','website1.domain.com')
INSERT INTO @T VALUES('192.168.30.6','website2.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website3.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website4.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website5.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website6.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website7.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website8.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website9.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website10.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website11.domain.com')
INSERT INTO @T VALUES('192.168.30.9','website12.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website13.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website14.domain.com')
INSERT INTO @T VALUES('192.168.30.24','website15.domain.com')
INSERT INTO @T VALUES('192.168.30.8',' website16.domain.com')
INSERT INTO @T VALUES('192.168.30.8',' website17.domain.com')
主查询

SELECT M.IP,STUFF (( Select ','+WEBSITE 
From @T S WHERE S.IP=M.IP
FOR XML PATH('')),1,1,'') 
FROM @T M GROUP BY M.IP
用于更新查询

 update Table1 T1 set IP = T2.SiteName
 from(SELECT M.IP,STUFF (( Select ','+WEBSITE 
 From @T S WHERE S.IP=M.IP
 FOR XML PATH('')),1,1,'')  AS Site
 FROM @T M GROUP BY M.IP
 ) S ON S.IP=T1.IP

您可以通过使用
STUFF

DECLARE @T Table(
IP VARCHAR(MAX),
WEBSITE VARCHAR(MAX))


INSERT INTO @T VALUES('192.168.30.6','website1.domain.com')
INSERT INTO @T VALUES('192.168.30.6','website2.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website3.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website4.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website5.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website6.domain.com')
INSERT INTO @T VALUES('192.168.30.7','website7.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website8.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website9.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website10.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website11.domain.com')
INSERT INTO @T VALUES('192.168.30.9','website12.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website13.domain.com')
INSERT INTO @T VALUES('192.168.30.8','website14.domain.com')
INSERT INTO @T VALUES('192.168.30.24','website15.domain.com')
INSERT INTO @T VALUES('192.168.30.8',' website16.domain.com')
INSERT INTO @T VALUES('192.168.30.8',' website17.domain.com')
主查询

SELECT M.IP,STUFF (( Select ','+WEBSITE 
From @T S WHERE S.IP=M.IP
FOR XML PATH('')),1,1,'') 
FROM @T M GROUP BY M.IP
用于更新查询

 update Table1 T1 set IP = T2.SiteName
 from(SELECT M.IP,STUFF (( Select ','+WEBSITE 
 From @T S WHERE S.IP=M.IP
 FOR XML PATH('')),1,1,'')  AS Site
 FROM @T M GROUP BY M.IP
 ) S ON S.IP=T1.IP

使用东西的建议是一个很好的解决方案。如果您的版本是SQL server 2017或更高版本,则可以使用更简单的de function STRING_AGG语法

DECLARE @T Table(
IP VARCHAR(MAX),
WEBSITE VARCHAR(MAX))

INSERT INTO @T 
VALUES    ('192.168.30.6','website1.domain.com')
        , ('192.168.30.6','website2.domain.com')
        , ('192.168.30.7','website3.domain.com')
        , ('192.168.30.7','website4.domain.com')
        , ('192.168.30.7','website5.domain.com')
        , ('192.168.30.7','website6.domain.com')
        , ('192.168.30.7','website7.domain.com')
        , ('192.168.30.8','website8.domain.com')
        , ('192.168.30.8','website9.domain.com')
        , ('192.168.30.8','website10.domain.com')
        , ('192.168.30.8','website11.domain.com')
        , ('192.168.30.9','website12.domain.com')
        , ('192.168.30.8','website13.domain.com')
        , ('192.168.30.8','website14.domain.com')
        , ('192.168.30.24','website15.domain.com')
        , ('192.168.30.8',' website16.domain.com')
        , ('192.168.30.8',' website17.domain.com');


SELECT t.IP, STRING_AGG(WEBSITE, ',') AS Websites
From @T t
GROUP BY t.IP

使用东西的建议是一个很好的解决方案。如果您的版本是SQL server 2017或更高版本,则可以使用更简单的de function STRING_AGG语法

DECLARE @T Table(
IP VARCHAR(MAX),
WEBSITE VARCHAR(MAX))

INSERT INTO @T 
VALUES    ('192.168.30.6','website1.domain.com')
        , ('192.168.30.6','website2.domain.com')
        , ('192.168.30.7','website3.domain.com')
        , ('192.168.30.7','website4.domain.com')
        , ('192.168.30.7','website5.domain.com')
        , ('192.168.30.7','website6.domain.com')
        , ('192.168.30.7','website7.domain.com')
        , ('192.168.30.8','website8.domain.com')
        , ('192.168.30.8','website9.domain.com')
        , ('192.168.30.8','website10.domain.com')
        , ('192.168.30.8','website11.domain.com')
        , ('192.168.30.9','website12.domain.com')
        , ('192.168.30.8','website13.domain.com')
        , ('192.168.30.8','website14.domain.com')
        , ('192.168.30.24','website15.domain.com')
        , ('192.168.30.8',' website16.domain.com')
        , ('192.168.30.8',' website17.domain.com');


SELECT t.IP, STRING_AGG(WEBSITE, ',') AS Websites
From @T t
GROUP BY t.IP

读了就别读了。保持模式正常化,我同意。如果您希望将此数据作为csv,请将其保留在数据库中,并在每次希望将其作为csvDo时将其分组。以每对一行的方式存储数据。读取,不读取。保持模式正常化,我同意。如果您希望将此数据作为csv,请将其保留在数据库中,并在每次希望将其作为csvDo时将其分组。以每对一行的方式存储数据。我使用的是SQL Server 2012和2016,我的版本不支持字符串\u agg。我使用的是SQL Server 2012和2016,我的版本不支持字符串\u agg。此查询非常有效,感谢您的帮助。将在登台机器中进行测试此查询非常有效,谢谢您的帮助。将在暂存机中进行测试