如何在sql server中加入相同的记录

时间:2017-06-12 10:43:04

标签: sql sql-server join

我有这样的数据:

| ID | NAME | PRICE    
| 01 | TEST | 5000    
| 01 | TEST | 10000    
| 02 | EAST | 4500    
| 03 | AEST | 5000    
| 03 | AEST | 5000

我想加入相同的记录,所以最终的结果是这样的:

| ID | NAME | PRICE1 | PRICE2    
| 01 | TEST | 5000   | 10000    
| 02 | EAST | 4500   | 0    
| 03 | AEST | 5000   | 5000

2 个答案:

答案 0 :(得分:0)

SQL表表示无序集。根据您提供的信息,无法确定您指定的price1price2。因此,您也可以使用MIN()MAX()

select id, name, min(price) as price1, max(price) as price2
from t
group by id, name;

如果您确实有一个指定排序的列,那么您可以使用pivot或条件聚合:

select id, name,
       max(case when seqnum = 1 then price end) as price1,
       max(case when seqnum = 2 then price end) as price2
from (select t.*,
             row_number() over (partition by id order by ??) as seqnum
      from t
     ) t
group by id, name;

??用于指定排序的列。

答案 1 :(得分:0)

IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL
Drop table #Temp
;With cte(ID,NAME,PRICE)
AS
(
SELECT 01 , 'TEST' , 5000  UNION ALL  
SELECT 01 , 'TEST' , 10000 UNION ALL   
SELECT 02 , 'EAST' , 4500  UNION ALL  
SELECT 03 , 'AEST' , 5000  UNION ALL    
SELECT 03 , 'AEST' , 5000
)
SELECT *, 'Price' + CAST(ROW_NUMBER()Over(PArtition by NAME Order by NAME) AS Varchar(5)) AS PriceCol INTO #Temp FROM cte

DECLARE @Coulmn nvarchar(max),
        @Coulmn2 nvarchar(max),
        @Sql nvarchar(max)

SELECT @Coulmn=STUFF((SELECT DISTINCT ', '+ '['+ PriceCol +']' From #Temp
FOR XML PATH ('')),1,1,'')
--SELECT @Coulmn

SELECT @Coulmn2=STUFF((SELECT DISTINCT ', '+ 'ISNULL(' + PriceCol + ',''0'')' +' AS  ['+PriceCol +']' From #Temp
FOR XML PATH ('')),1,1,'')
--SELECT @Coulmn2

SET @Sql=' SELECT  ID,NAME, '+@Coulmn2+ ' From 
            (
            SELECT * From #Temp 
            )As Src
            PIVOT
            (
            MAX(PRICE) FOR PriceCol IN ('+ @Coulmn +')
            )Pvt
            Order By Pvt.ID 
            '
Print @Sql
Exec(@Sql)