2015-06-20 62 views
-2

的SQL Server:2012SQL查詢來加入,CONCAT值

這些都是3個表。

第一個表是用戶的(顧問)表 第二個是價格表,從第一列中的每個用戶都有一個價格 最後一個表定義在什麼區(市)的顧問提供服務

Consultants  Prices   Area 
uid | Name  uid | Price  uid | City 
----|-----  -----|-------  ----|------ 
1 | Dave  1 | 5   1 | NY 
2 | Adrian  2 | 7   1 | LA 
3 | John  4 | 5   4 | NY 
4 | Lee       4 | NO 
            4 | LA 
            4 | SF 

我需要從所有的表是這樣的選擇:

uid | Price | City 
-----|----------|------- 
1 | 5  | NY, LA 
-----|----------|------- 
2 | 7  | 
-----|----------|------- 
4 | 5  | NY, NO, LA, SF 
-----|----------|------- 

我該怎麼做這個選擇?任何想法?

+2

您可以使用'FOR XML PATH'。看看[這裏](例如http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-sql-server)。 –

+1

使用合適的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。 – HABO

回答

1

只要你不指定的數據庫,假設SQL Server 2008中,你可以使用STUFF functionGroup BY Clause到多行concanate成單逗號分隔值

Select C.uid, P.price, ISNULL(A.City,'') City 
From Consultants C 
    INNER JOIN Prices P ON C.uid = P.uid 
    LEFT JOIN (
       SELECT UID 
         ,STUFF((SELECT ', ' + CAST(city AS VARCHAR(10)) [text()] 
         FROM Area 
         WHERE UID = t.UID 
         FOR XML PATH(''), TYPE) 
         .value('.','NVARCHAR(MAX)'),1,2,' ') CITY 
        FROM Area t 
        GROUP BY UID) A 
     ON C.uid = A.uid 

Working SQL Fiddle

+0

謝謝!你救了我! –

+1

什麼是您的數據庫,SQL Server或我的SQL – HaveNoDisplayName

+0

我satabase是SqlServer。您的解決方案非常完美再次感謝你! –

1

可能是這樣,你也可以做

declare @consultants table (uid int,name varchar(10)) 
insert into @consultants (uid,name)values (1,'dave'),(2,'adrian'),(3,'jon'),(4,'lee') 
declare @Prices table (uid int,price int) 
insert into @Prices(uid,price)values (1,5),(2,7),(4,5) 

declare @Area table (uid int,city varchar(5)) 
insert into @Area(uid,city)values (1,'NY'),(1,'LA'),(4,'NY'),(4,'LA'),(4,'SF'),(4,'NO') 

select t.uid,tt.price,ISNULL(STUFF((select +', '+ city from @Area where uid = t.uid FOR XML PATH(''), TYPE) 
         .value('.','NVARCHAR(MAX)'),1,2,' '),'')CITY from @consultants t INNER JOIN @Prices tt 
ON t.uid = tt.uid