2015-05-22 62 views
1

我想要做一個SQL查詢/ vTable我有點迷惑。我們有一個包含計算機(虛擬的和物理的)一個表:查詢自己的表MS SQL

CluserName ComputerName CoreCount 
N/A   BackOffice1 2 
cluster1 sqlServer  4 
cluster1 webserver  2 
cluster1 sqlServer2 6 
cluster2 adServer  2 
cluster2 adServer2  4 

我不喜歡拉vTable,會給我這樣的事情:

Cluster: cluster1, 12 (this is a summation of the cores in the 
cluster) sqlServer, 4 webserver, 2 sqlServer2, 6 Cluster: cluster2, 6 
adServer, 2 adServer2, 4 

所以我的兩個問題是:

  1. 是不是愚蠢到通過vTable
  2. 做到這一點如果不是這是一個INNER JOIN或窩編輯查詢?

感謝。

+1

你使用的是什麼版本的sql? SQL服務器,MySQL,甲骨文? –

+1

標題說這是MS Sql – Tobi

+0

我正在使用MS SQL 2014 –

回答

0

http://sqlfiddle.com/#!3/4f7fe/11/0

SELECT CluserName, SUM(CoreCount) AS CoreCount, 
SUM(CASE WHEN ComputerName = 'sqlServer' THEN CoreCount ELSE 0 END) AS sqlServer, 
SUM(CASE WHEN ComputerName = 'webserver' THEN CoreCount ELSE 0 END) AS webserver, 
SUM(CASE WHEN ComputerName = 'sqlServer2' THEN CoreCount ELSE 0 END) AS sqlServer2, 
SUM(CASE WHEN ComputerName = 'asServer' THEN CoreCount ELSE 0 END) AS asServer 
FROM table1 
group by CluserName 

更新使用動態查詢:

此建立一個動態查詢得到的,所以當新的計算機名稱添加它應該工作表中的計算機名稱。

http://sqlfiddle.com/#!3/c95d3/34

DECLARE @statement nvarchar(max) 
SET @statement = 'SELECT CluserName, SUM(CoreCount) AS CoreCount, ' 
SELECT @statement = @statement + 
(SELECT distinct 'SUM(CASE WHEN COMPUTERName = ''' + ComputerName 
+ ''' THEN CoreCount ELSE 0 END) AS ' + ComputerName + ',' FROM table1 FOR XML PATH('') 
) 
+ ' '''' FROM table1 group by CluserName' 

EXECUTE sp_executesql @statement 
+0

唯一的問題是,計算機名稱注意到總是相同的。因此,如果服務器的相同部分發生更改,則計算失敗。 –

+0

@FrederikKrogh你的意思是第二天你可以得到一臺名爲sqlServer4的新電腦,它會被添加到這張表中? – artm

+0

是或新的羣集或移動它。 :) –

0

組由ROLLUP

DECLARE @t TABLE 
    (
     CluserName VARCHAR(20) , 
     ComputerName VARCHAR(20) , 
     CoreCount INT 
    ) 

INSERT INTO @t 
VALUES ('N/A', 'BackOffice1', 2), 
     ('cluster1', 'sqlServer', 4), 
     ('cluster1', 'webserver', 2), 
     ('cluster1', 'sqlServer2', 6), 
     ('cluster2', 'adServer', 2), 
     ('cluster2', 'adServer2', 4) 


SELECT CluserName , ComputerName, SUM(CoreCount) CoreCount 
FROM @t 
GROUP BY ROLLUP(CluserName,ComputerName) 
ORDER BY GROUPING(CluserName) DESC, CluserName, GROUPING(ComputerName) desc 

輸出:

CluserName ComputerName CoreCount 
NULL  NULL   20 
cluster1 NULL   12 
cluster1 sqlServer  4 
cluster1 sqlServer2  6 
cluster1 webserver  2 
cluster2 NULL   6 
cluster2 adServer  2 
cluster2 adServer2  4 
N/A   NULL   2 
N/A   BackOffice1  2 

如果你不想那麼總行:

SELECT CluserName , ComputerName, SUM(CoreCount) CoreCount 
FROM @t 
GROUP BY ROLLUP(CluserName,ComputerName) 
HAVING CluserName IS NOT NULL OR ComputerName IS NOT NULL 
ORDER BY GROUPING(CluserName) DESC, CluserName, GROUPING(ComputerName) desc 

輸出:

CluserName ComputerName CoreCount 
cluster1 NULL   12 
cluster1 sqlServer  4 
cluster1 sqlServer2  6 
cluster1 webserver  2 
cluster2 NULL   6 
cluster2 adServer  2 
cluster2 adServer2  4 
N/A   NULL   2 
N/A   BackOffice1  2 
0

您可以動態透視聲明如下所示: How to return dynamic columns from grouped values in SQL Server (Stored Procedure)

你的情況

它應該是這樣的,我認爲 - 試試看:

DECLARE @computernames NVARCHAR(MAX) 
DECLARE @total NVARCHAR(MAX) 
DECLARE @stmt NVARCHAR(MAX) 

SET @computernames = '' 
SET @stmt = '' 

--Get List of Computers 
SELECT @computernames = @computernames + ',[' + ComputerName + ']' 
FROM yourtable 
GROUP BY ComputerName 

--Remove Leading Comma 
SET @computernames = RIGHT(@computernames, LEN(@computernames)-1) 

--transform [adserver],[adserver2] to ISNULL([adserver],0) + ISNULL([adserver2],0) 
SET @total = 'ISNULL(' + REPLACE(@computernames,'],[','],0) + ISNULL([') + ',0)' 


--Build PIVOT Statement 
SET @stmt = 'SELECT [ClusterName],' + @computernames + ','+ @total + ' AS TotalCores 
      FROM yourtable 
        PIVOT 
        (
         SUM(CoreCount) FOR ComputerName IN (' + @computernames + ') 
        ) pvt 
      ORDER BY [ClusterName]' 


--Execute 
EXEC sp_executesql @stmt 

結果將如下所示:

ClusterName adServer adServer2 BackOffice1 sqlServer sqlServer2 webserver TotalCores 
cluster1 NULL  NULL  NULL  4   6   2   12 
cluster2 2  4   NULL  NULL  NULL  NULL  6 
N/A   NULL  NULL  2   NULL  NULL  NULL  2 
+0

它在各方面都是動態的。即使您插入/刪除/更新ComputerNames或羣集,它也可以工作 – CeOnSql