2011-07-27 50 views
0

我有一個表是更新有一些重複數據的領域。我想彙總這些數據來總結它。我如何爲SQL Server執行此操作?我有一個下面的輸出和結構的例子。我嘗試了一些不同的連接,但是我看到了重複數據和一些我不明白的錯誤。如何通過使用SQL Server連接到單個表來構建摘要?

表結構

  • 日誌文件名稱(字符串)
  • 狀態(INT) - 可能是1,2,3取決於應用程式輸入

數據

f1, 3, 0 
f1, 2, 1 
f1, 3, 0 
f2, 1, 1 
f2, 1, 1 
f2, 2, 1 
.... 

輸出

File | Count of status == 1 | Count of status == 2 
f1 | 59     | 43 
f2 | 28     | 99 
f3 | 23     | 16 
+0

爲什麼你的數據有3列,但你只告訴我們兩(日誌文件和狀態)? –

+0

@David B - 因爲它是每種不同狀態類型的計數。所以如果他有'n'狀態,列的數量將是n + 1(+1是指文件名)。也被稱爲矩陣。 – JonH

+0

-1用於動態生成數據庫設計。 –

回答

0

彙總數據使用匯總:

http://msdn.microsoft.com/en-us/library/ms189305(v=sql.90).aspx

什麼版本的SQL服務器您使用的是?

如果你沒有想使用匯總這應該幫助:

SELECT 
     FileName, 
     SUM(CASE WHEN Status = 1 THEN 1 ELSE 0 END) AS CountOf1, 
     SUM(CASE WHEN Status = 2 THEN 1 ELSE 0 END) AS CountOf2, 
     SUM(CASE WHEN Status = 3 THEN 1 ELSE 0 END) AS CountOf3 
FROM 
     MyTable 
GROUP BY FileName 
ORDER BY FileName 
+0

沒有錯,但只適用於靜態確定的狀態值。 –

+0

的確如此。我有這種狂熱總是尋找最普通的答案。沒有downvote你,雖然 –

+0

我很肯定彙總不適用於此。 ORDER BY應該在GROUP BY之後。 – sayap

0
SELECT 
    file, 
    SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS [Count of status == 1] , 
    SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS [Count of status == 2] 
FROM Table 
GROUP BY file 
ORDER BY file 
+0

方法沒有錯,但只適用於靜態確定的狀態值。 –

+0

@Jonh,「按順序排序」?你在開玩笑吧? http://msdn.microsoft.com/en-us/library/ms189499%28v=sql.90%29.aspx – EricZ

+0

@EricZ我不好你是對的我在這裏工作太多不同的系統... – JonH

2

假設你使用的是SQL Server 2005或以上,這裏是代碼:

DECLARE @cols VARCHAR(1000) 
DECLARE @sqlquery VARCHAR(2000) 

SELECT @cols = STUFF((SELECT distinct ',' + QuoteName(cast([status] as varchar)) 
         FROM LogTable FOR XML PATH('')), 1, 1, '') 


SET @sqlquery = 'SELECT * FROM 
     (SELECT UserIndex, [status] 
     FROM LogTable) base 
     PIVOT (Count(status) FOR [status] 
     IN (' + @cols + ')) AS finalpivot' 

EXECUTE (@sqlquery) 

這將無論你有多少不同的地位,都可以工作。它用PIVOT動態地組裝一個查詢。

更新

由於@JonH指出的那樣,是我貼的代碼,這使其能夠注入攻擊漏洞。現在通過在形成列名時使用QUOTENAME來解決這個問題。

其他例子:

+0

有趣。我需要閱讀關於PIVOT的更多信息。 – Jim

+0

試一試。自從我學到這個訣竅以來,報道從來都不一樣 –

+0

當4分鐘後選擇「最佳」腳本時,是不是很煩人?很好的動態腳本。 +1。 SELECT @cols = coalesce(@cols +',','')+'['+ cast([status] as varchar) +']'FROM(從@logtable中選擇不同的狀態)狀態訂單 –