2015-08-14 15 views
1

我有一個表中的SQL不同的列

Category | Subcategory | Region | Count | Percent | 
    A |  Aa  | ON | 3 | 5% | 
    A |  Aa  | AT | 1 | 2% | 
    A |  Ab  | ON | 5 | 10% | 
    B |  Bc  | AT | 1 | 21% | 

但我希望能夠做的是要給我這個樣子

查詢的SQL語句
Category | Subcategory | Region | Count | Percent | Region | Count | Percent | 
    A |  Aa  | AT | 1 | 2% | ON | 3 | 5% | 
    A |  Ab  | NULL/0 | NULL/0| NULL/0 | ON | 5 | 10% | 
    B |  Bc  | AT | 1 | 21% | NULL/0 | NULL/0| NULL/0 | 

作爲選擇還是存儲過程,SQL可以做到這一點嗎?

+0

可能的 - 是的。一個好主意?沒那麼多。爲查詢更好地使用唯一名稱並在表示層中更改它們。 –

+0

每個地區的唯一名稱?因爲我正在考慮用每個區域的存儲過程進行一些查詢,然後進行加入,但我不確定這是否有效。 – Nighthee

回答

1

正如評論中指出的那樣,您應該使用唯一的列名稱。爲了實現您所需的輸出,你可以使用條件彙總:

SQL Fiddle

SELECT 
    Category, 
    SubCategory, 
    Region_AT = MAX(CASE WHEN Region = 'AT' THEN Region END), 
    Count_AT = MAX(CASE WHEN Region = 'AT' THEN [Count] END), 
    Percent_AT = MAX(CASE WHEN Region = 'AT' THEN [Percent] END), 
    Region_ON = MAX(CASE WHEN Region = 'ON' THEN Region END), 
    Count_ON = MAX(CASE WHEN Region = 'ON' THEN [Count] END), 
    Percent_ON = MAX(CASE WHEN Region = 'ON' THEN [Percent] END) 
FROM Tbl 
GROUP BY Category, SubCategory 

如果你不知道有多少Region s爲那裏,你可以使用動態交叉分析:

SQL Fiddle

DECLARE @sql1 NVARCHAR(2000) = '', 
     @sql2 NVARCHAR(2000) = '', 
     @sql3 NVARCHAR(2000) = '' 

SELECT @sql1 = 
'SELECT 
    Category 
    , SubCategory' + CHAR(10) 

SELECT @sql2 = @sql2 + 
' , MAX(CASE WHEN Region = ''' + Region + ''' THEN Region END) AS Region_' + Region + CHAR(10) + 
' , MAX(CASE WHEN Region = ''' + Region + ''' THEN [Count] END) AS Count_' + Region + CHAR(10) + 
' , MAX(CASE WHEN Region = ''' + Region + ''' THEN [Percent] END) AS Percent_' + Region + CHAR(10) 
FROM(
    SELECT DISTINCT Region FROM Tbl 
)t 

SELECT @sql3 = 
'FROM Tbl 
GROUP BY Category, SubCategory' 

PRINT (@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 

您可以閱讀更多關於Jeff Moden在這個偉大的article中的動態交叉表。

+0

您的先生是上帝。這工作令人驚訝!謝謝! – Nighthee

+0

請確保閱讀引用的文章。這是一個容易閱讀,非常有教育意義。 =) –