2017-08-10 27 views
0

我真的不知道該怎麼稱呼它,而且我覺得我可能會錯過一些非常基本的東西,但我一直在搜索互聯網,並且一直無法找到簡單或直接的T-SQL操作來做我正在尋找的東西。T-SQL中的二維網格加入?表內行與行之間的相關性?

我正在構建一個包含比賽比賽數據的數據庫,並且我想要顯示大網格中任何兩名球員之間的球員比賽(總贏/輸)。因此,舉例來說,如果我有這種組合的臨時表:

Player1 wins losses Player2 
A  4 2  B 
A  1 3  C 
B  2 4  A 
B  0 5  C 
C  3 1  A 
C  5 0  B 

我想找到一種方式來獲得這些結果在網格中,這樣的事情:

 A  B  C 
A  0/0 4/2 1/3 
B  2/4 0/0 0/5 
C  3/1 5/0 0/0 

當然,這是一超級簡化的例子。實際上可能有幾十個甚至數百個玩家。無論有多少玩家,它都需要能夠無縫工作。我將從一個報告風格的過程中運行這個過程來分析數據,例如可以複製/粘貼到excel中的格式。

我確定我可以用一些非常複雜的動態SQL做這樣的事情,但我希望有一個更好/更標準的方式來構建這種方式的查詢。

我有一種感覺,我可能甚至已經學會了多年前在大學裏如何做到這一點,但之後就被遺忘了。

回答

4

EDIT 2 - 來源將是一個臨時表和PLAYER1將是全包

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select XAxis=A.Player 
       ,YAxis=B.Player 
       ,Value=''0/0'' 
     From (Select Distinct Player=Player1 From #YourTemp) A 
     Join (Select Distinct Player=Player1 From #YourTemp) B on 1=1 
     Union All 
     Select Player1 
       ,Player2 
       ,Value=concat(wins,''/'',losses) 
      From #YourTemp 
    ) A 
Pivot (max([Value]) For [XAxis] in (' + Stuff((Select Distinct ','+QuoteName(Player1) From #YourTemp Order by 1 For XML Path('')),1,1,'') + ')) p' 
Exec(@SQL); 
--Print @SQL 

返回

enter image description here

如果它與可視化子查詢「餵養」透視看起來像這樣幫助:

enter image description here

現在,如果源溫度包含了所有組合

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select XAxis=Player1 
       ,YAxis=Player2 
       ,Value=concat(wins,''/'',losses) 
      From #YourTemp 
    ) A 
Pivot (max([Value]) For [XAxis] in (' + Stuff((Select Distinct ','+QuoteName(Player1) From #YourTemp Order by 1 For XML Path('')),1,1,'') + ')) p' 
Exec(@SQL); 
--Print @SQL 
+0

謝謝。我擔心我必須走這條路。當然似乎很奇怪,沒有現有的SQL語法來處理這種類型的查詢,因爲它似乎會經常出現。但我想這就是一些更高級的數據庫語言的用途。 –

+0

我會暫時將其打開,以防某人能夠提供更簡單的解決方案。 –

+1

@TimLeaf如你所知,SQL Server是按設計聲明的。它不支持宏替換(比如說... Visual FoxPro)。我會稍微多吃一點,看看我能不能「擰緊螺絲釘」。這將是一個簡單的動態支點,唯一的技巧就是讓兩個軸線成方形。 –