Sql server 我想在SQL Server中执行组连接
我知道group_concat在SQL Server 2008中不起作用,但我想做group_concat 我的示例数据如下所示:Sql server 我想在SQL Server中执行组连接,sql-server,sql-server-2008,string-aggregation,Sql Server,Sql Server 2008,String Aggregation,我知道group_concat在SQL Server 2008中不起作用,但我想做group_concat 我的示例数据如下所示: email address | product code ----------------------+--------------- garry123@gmail.com | A123A garry123@gmail.com | AB263 ada121@hotmail.com | 45632A ada12
email address | product code
----------------------+---------------
garry123@gmail.com | A123A
garry123@gmail.com | AB263
ada121@hotmail.com | 45632A
ada121@hotmail.com | 78YU
garry123@gmail.com | 6543D
我想要这个结果:
garry123@gmail.com | A123A,AB263,6543D
ada121@hotmail.com | 45632A,78YU
我尝试过的代码:
SELECT
c.EmailAddress,
od.concat(productcode) as Product_SKU
FROM
OrderDetails od
JOIN
Orders o ON od.OrderID = o.OrderID
JOIN
Customers c ON c.CustomerID = o.CustomerID
WHERE
o.OrderDate BETWEEN 01/01/2016 AND GETDATE()
GROUP BY
c.EmailAddress
我得到一个错误:
找不到列od或用户定义函数或聚合od.concat,或者名称不明确
但这是行不通的。谁能告诉我做这件事的正确方法吗
编辑后我正在尝试的代码:
SELECT
c.EmailAddress,
productcode = STUFF((SELECT ',' + od.productcode
FROM Orderdetails od
WHERE c.EmailAddress = od.EmailAddress
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM
OrderDetails od
JOIN
Orders o ON od.OrderID = o.OrderID
JOIN
Customers c ON c.CustomerID = o.CustomerID
WHERE
o.OrderDate BETWEEN 01/01/2016 AND GETDATE()
现在我得到了这个错误:
无效的列名“EmailAddress”
在本例中,为您演示如何连接一个自连接,但所有连接都起作用,并为此使用东西。注意填充中的WHERE子句。这就是将记录链接到正确值的原因
declare @test table
(
email varchar(50),
address varchar(50)
)
insert into @test VALUES
('garry123@gmail.com','A123A'),
('garry123@gmail.com','AB263'),
('ada121@hotmail.com','45632A'),
('ada121@hotmail.com','78YU'),
('garry123@gmail.com','6543D')
SELECT DISTINCT
email,
Stuff((SELECT ', ' + address
FROM @test t2
WHERE t2.email = t1.email
FOR XML PATH('')), 1, 2, '') Address
FROM @test t1
编辑
好的,那么你真正想要的是:
declare @customers table
(
emailaddress varchar(50),
customerid int
)
insert into @customers VALUES
('garry123@gmail.com',1),
('ada121@hotmail.com',2)
declare @orders table
(
orderid int,
customerid int,
orderdate date
)
insert into @orders VALUES
(1, 1, '2017-06-02'),
(2, 1, '2017-06-05'),
(3, 1, '2017-07-13'),
(4, 2, '2017-06-13')
declare @orderdetails table
(
id int,
orderid int,
productcode varchar(10)
)
insert into @orderdetails VALUES
(1, 1, 'apple pie'),
(2, 1, 'bread'),
(3, 2, 'custard'),
(4, 2, 'orange'),
(5, 3, 'orange'),
(6, 4, 'orange')
SELECT DISTINCT c.EmailAddress, productcode=
STUFF((SELECT ',' + odc.productcode FROM
(SELECT DISTINCT emailaddress,productcode FROM
@orders o2 inner join @orderdetails od2 on
o2.orderid = od2.orderid
inner join @customers c2 ON c2.customerid = o2.customerid) odc
WHERE odc.emailaddress=c.emailaddress
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM @OrderDetails od
JOIN @Orders o ON od.OrderID = o.OrderID
JOIN @Customers c ON c.CustomerID=o.CustomerID
WHERE o.OrderDate BETWEEN '2016-01-01' AND getdate()
注意这里的变化。内容中的选择现在来自子查询,因此您可以按EmailAddress分组
补充说明
您的目标是将产品代码按电子邮件地址表示的客户分组。问题在于,产品代码在orderdetails表中,emailaddress在customer表中,但没有链接这两者的字段。customer表与orders表具有一对多关系,orders表与orderdetails表具有一对多关系。这是一个太多的抽象层次。因此,我们需要通过提供productcode和emailaddress之间的直接链接来帮助数据库。这是通过子查询完成的。我希望这能让你更清楚 注意这个答案:@TheGameiswar的可能复制品..我研究了解决方案,但如何将其应用于我的问题?该解决方案中的表名、列名是什么??我有3张桌子要加入。如果您能帮助我在最终输出的基础上更多地使用cte,我将不胜感激。我正在尝试这样做:从Orderdetails od中选择c.EmailAddress,productcode=STUFFSELECT',并选择+od.productcode,其中c.EmailAddress=od.EmailAddress代表XML路径,键入.value',NVARCHARMAX',1,1,从OrderDetails od加入订单o ON od.OrderID=o.OrderID加入客户c ON c.CustomerID=o.CustomerID其中o.OrderDate介于2016年1月1日和getdate之间,但收到错误消息…如果您可以帮助更正我的代码,请用新的尝试编辑您的问题并告诉我们错误。EmailAddress是否在OrderDetails中?否,它位于customers表中。产品代码在订单明细表中