Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我想在SQL Server中执行组连接_Sql Server_Sql Server 2008_String Aggregation - Fatal编程技术网

Sql server 我想在SQL Server中执行组连接

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

我知道group_concat在SQL Server 2008中不起作用,但我想做group_concat

我的示例数据如下所示:

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表中。产品代码在订单明细表中