2016-06-10 54 views
-1

假設我有一個非常簡單的表是這樣的:如何使用任意ID來轉換數據以便比較2條記錄?

create table #People (ID_Num int, Gender char(1), Age int, Name varchar(50)) 

insert into #People values (7612,'M',38,'Joe') 

insert into #People values (2290,'F',17,'Sally') 

insert into #People values (93542,'F',38,'Frederica') 

的每條記錄都有一個ID和屬性都與該ID相關聯。

假設我想比較2分任意的記錄,在一份報告中/表看起來像這樣:

Column_Name |Value (For ID 7612) |Value (For ID 93542) 
------------------------------------------------------ 
Gender  |M     |F 
Age   |38     |38 
Name  |Joe     |Frederica 

我該怎麼辦呢?當我嘗試創建類似上面的東西時,我得到所有扭曲的PIVOT/UNPIVOT語法(我是否都需要?)

有沒有辦法對任何2個任意ID做這樣的事情? (也就是說,只需將ID插入變量/參數中,相同的代碼就可以重新用於任何2條記錄)。

如果你想知道爲什麼我要去解決所有這些問題,而不是僅僅比較它們出現在表格中的兩條記錄:在我得到樞軸部分的權利後,我也想過濾,所以我們只查看有差別的列。例如上面,我會顯示性別和姓名,但不是年齡。過濾出值不同的ROWS要比更容易,而不是寫入SQL來動態選擇帶有差異的COLUMNS。

+0

這將讓醜陋更多更多的人爲你的桌子添加瘋狂的列數量。如果你能用一些例子來詳細說明你的最後一段,我肯定會制定一個更優雅的解決方案。只是我的兩分錢。 – scsimon

回答

0

不,不幸的是,這將無法正常工作。爲了實現樞紐,您需要知道您想要以旋轉格式獲得的列。在你的情況下,任意的Id不會讓你這樣做。您可以通過轉動年的數據,等等。

我這樣做:

select * from #people p1 
left join #people p2 on p2.id_num<>p1.id_num 

將採取每行進一步處理它高級語言(C#,使用Java,Python等)

我可以問你爲什麼你需要用這種方式來格式化你的數據?可能有一些方法可以爲此創建動態SQL,但通常這是一種破解,我會遠離。您的問題更可能通過您在SQL中獲得的工具/命令解決,您可能需要以某種方式重新修改它。如果您需要生成報告,我會進一步處理SQL以外的數據以使其符合您的報告格式。

0

使用PIVOT我們也可以根據您的表中的數據實現上述結果集我已經給 普通透視

select col,[2290], [7612], [93542] from (
Select 
     T.id_num, 
     T.col, 
     T.val 
    FROM (
select id_num,col,val from #People 
CROSS APPLY (values 
      ('age',cast(age as varchar)), 
      ('gender',gender), 
      ('name',name))cs(col,val))T)TT 
pivot 
(
    max(val) 
    for id_num in ([2290], [7612], [93542]) 
) piv 

動態透視

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(id_num) 
        from #People 
        group by id_num 
        order by id_num 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
--print @COLS 
set @query = N'SELECT col,' + @cols + N' from (
Select T.id_num,T.col,T.val from (
select id_num,col,val from #People 
CROSS APPLY (values (''age'',cast(age as varchar)),(''gender'',gender),(''name'',name))cs(col,val))T)TT 
pivot 
(
    max(val) 
    for id_num in (' + @cols + N') 
      ) p ' 

exec sp_executesql @query;