Sql-Server

將多行合併為最少數量的不同值行

  • June 20, 2018

在 SQL Server 中,是否有人知道將多行數據合併/展平為僅包含不同非空值的盡可能少的行的好方法。

是的

像這樣的數據集: 前

像這樣: 後

如果有幫助,之前的數據集是一個旋轉的行列表,但沒有聚合。我無法在數據透視期間聚合它,因為我想保留每個不同的值而不是取 MAX 或 MIN。

我能想到的唯一方法是將數據拆分並將它們重新組合在一起,這不會很有效。

您的數據似乎在各個列值之間缺乏任何關係。如果您可以定義這種關係,您就可以PIVOT適當地處理數據。

例如,如果您只是想根據值的順序(基於您的預設排序規則)對齊數據,您可以使用:

with rawdata as (
select * from (values
   ('00000000-0000-0000-0000-000000037850','Col2','Yes_02')
   ,('00000000-0000-0000-0000-000000037850','Col3','Full marketing schedule')
   ,('00000000-0000-0000-0000-000000037850','Col3','Negotiations started, fell through')
   ,('00000000-0000-0000-0000-000000037850','Col3','No budget')
   ,('00000000-0000-0000-0000-000000037850','Col3','Not interest')
   ,('00000000-0000-0000-0000-000000037850','Col3','Passed to Summerhouse')
   ,('00000000-0000-0000-0000-000000037850','Col4','Darren Waters_01')
   ,('00000000-0000-0000-0000-000000037850','Col4','David Edwards_01')
   ,('00000000-0000-0000-0000-000000037850','Col4','David Simons_01')
   ,('00000000-0000-0000-0000-000000037850','Col4','Jason Gould_01')
   ,('00000000-0000-0000-0000-000000037850','Col4','Martin Thorpe_01')
   ,('00000000-0000-0000-0000-000000037850','Col5','BETT New Exhibitor')
   ,('00000000-0000-0000-0000-000000037850','Col5','BETT Standard Exhibitor')
   ,('00000000-0000-0000-0000-000000037850','Col5','Exhibitor Verified')
   ) x ([ID],[Col],[Value])
   ), ordered as (
select
   ID
   ,Col
   ,[Value]
   ,rn = row_number() over (partition by ID, Col order by [Value])
   from rawdata
   )
select
   ID
   ,[Col1],[Col2],[Col3],[Col4],[Col5]
   from ordered o
   pivot(max([Value]) for Col in ([Col1],[Col2],[Col3],[Col4],[Col5])) pvt
   ;

引用自:https://dba.stackexchange.com/questions/210150