2017-06-12 22 views
-1

我有這樣的數據:如何加入相同的記錄在SQL Server

| 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 
+1

你嘗試過這麼遠嗎? – Jens

+2

您還可以與我們分享您到目前爲止所嘗試過的嗎? –

+0

SQL查詢導致以前已知的列。您的結果顯示兩個價格欄。能有更多嗎?如果是這樣,多少?這是否重要,哪個價格顯示爲price1,哪個顯示爲price2?具有所有價格而不是單獨價格欄的字符串是否足夠? –

回答

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; 

??對於指定排序的列。

+0

感謝您的回覆。但如果價格字段具有相同的ID相同的價值? – magniche

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, '[email protected]+ ' From 
      (
      SELECT * From #Temp 
      )As Src 
      PIVOT 
      (
      MAX(PRICE) FOR PriceCol IN ('+ @Coulmn +') 
      )Pvt 
      Order By Pvt.ID 
      ' 
Print @Sql 
Exec(@Sql) 
相關問題