我有这样的数据:
| 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
答案 0 :(得分:0)
SQL表表示无序集。根据您提供的信息,无法确定您指定的price1
和price2
。因此,您也可以使用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)