2012-10-16 68 views
0

我使用MS SQL Server 2012點的快速安排SQL查詢結果以不同的方式

我的查詢是:

select invTypeMaterials.[typeID], invTypes.[typeName], invTypeMaterials.[quantity] from invTypeMaterials 
    inner join invTypes 
    on invTypeMaterials.materialTypeID = invTypes.[typeID] 

我的結果是這樣的:

typeID | typeName | quantity 
18  | Blah1 | Integer 
18  | Blah2 | Integer 
... | ...  | ... 
36  | Blah1 | Integer 
36  | Blah1 | Integer 

我真的很喜歡我結果看起來像這樣:

typeID | Blah1 | Blah2 | ... | Blah7 
18  | Integer | Integer | ... | Integer 
... 
36  | Integer | Integer | ... | Integer 

這將是可能的,如果我解析外部的數據,但我希望有一些漂亮的SQL語句,這將很好,很容易爲我做到這一點。對於類型,只有Blah1到Blah7,所有類型的值都是整數。

在此先感謝!

+1

搜索'PIVOT' –

+0

給Google,我去了一小會兒。感謝提示! –

+0

你可以用一個關鍵點來做到這一點,但是它很難做到的部分原因是,從位置關係設計來看,這是一個在應用程序層次上的_belongs_工作。 –

回答

3

您沒有指定您正在使用的RDBMS。但這基本上是PIVOT

的MySQL:

如果你正在使用MySQL它不具有PIVOT功能,但它可以使用CASE語句和聚合函數複製。有兩種方法可以做到這一點 - 無論是使用硬編碼的靜態版本還是使用預準備語句的動態版本。

靜態版本的MySQL(見SQL fiddle with demo):

select m.typeID, 
    sum(case when t.typename = 'type 1' then m.quantity else 0 end) Type1, 
    sum(case when t.typename = 'type 2' then m.quantity else 0 end) Type2, 
    sum(case when t.typename = 'type 3' then m.quantity else 0 end) Type3 
from invTypeMaterials m 
inner join invTypes t 
    on m.typeID = t.typeID 
group by m.TypeId; 

動態版本的MySQL(見SQL Fiddle with Demo):

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when t.typename = ''', 
     t.typename, 
     ''' then m.quantity else 0 end) ', 
     replace(t.typename, ' ', '') 
    ) 
) INTO @sql 
from invTypeMaterials m 
inner join invTypes t 
    on m.typeID = t.typeID; 

SET @sql = CONCAT('SELECT m.typeID, ', @sql, ' 
        from invTypeMaterials m 
        inner join invTypes t 
        on m.typeID = t.typeID 
        GROUP BY m.TypeId'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Server有一個PIVOT功能,你可以做到這一點無論是靜態或動態。

靜態的SQL Server版本(見SQL Fiddle with Demo):

select typeid, 
    isnull([Type 1], 0) type1, 
    isnull([Type 2], 0) type2, 
    isnull([Type 3], 0) type3 
from 
(
    select m.TypeId, 
    m.quantity, 
    t.typename 
    from invTypeMaterials m 
    inner join invTypes t 
    on m.typeID = t.typeID 
) x 
pivot 
(
    sum(quantity) 
    for typename in ([Type 1], [Type 2], [Type 3]) 
) p 

動態的SQL Server版本(見SQL Fiddle with Demo):

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @colsNull as nvarchar(max) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(typename) 
        from invTypes 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsNull 
    = STUFF((SELECT distinct ', IsNull(' + QUOTENAME(typename) + ', 0) as '+ replace(typename, ' ', '') 
        from invTypes 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT typeid, ' + @colsNull + ' from 
      (
       select m.TypeId, 
        m.quantity, 
        t.typename 
       from invTypeMaterials m 
       inner join invTypes t 
        on m.typeID = t.typeID 
      ) x 
      pivot 
      (
       sum(quantity) 
       for typename in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

非常感謝你的代碼。我今天又回來了,所以我會讓你知道它是怎麼回事!我更新了問題以反映我正在使用MS SQL Server 2012。 –