2013-06-18 65 views
1

對於多個網站,我有一個包含數千行日誌統計信息(每頁,每個網站的視圖數)的單個表。例如,在該表中,多個站點可以有相同的頁面名稱的單獨統計:爲SQL Server中的表中的每個2 DISTINCT列選擇行

+----+---------+-------+------------+ 
| id | page | views | sitename | 
+----+---------+-------+------------+ 
| 1 | page1 | 7 | name1 | 
+----+---------+-------+------------+ 
| 2 | page1 | 5 | name2 | 
+----+---------+-------+------------+ 
| 3 | page2 | 3 | name2 | 
+----+---------+-------+------------+ 
| 4 | page1 | 7 | name3 | 
+----+---------+-------+------------+ 
| 5 | page2 | 5 | name3 | 
+----+---------+-------+------------+ 
| 6 | page3 | 3 | name3 | 
+----+---------+-------+------------+ 

我試圖制定一個查詢,讓我列出每個不同的頁面名稱,爲每個不同的網址 - - 和顯示視圖每站點的頁面數:

+-------+----------+-------+---------+ 
| page | name1 | name2 | name3| 
+-------+----------+-------+---------+ 
| page1 | 7  | 5 |  7 | 
+-------+----------+-------+---------+ 
| page2 | NULL  | 3 |  5 | 
+-------+----------+-------+---------+ 
| page3 | NULL  | NULL |  3 | 
+-------+----------+-------+---------+ 

如果一個網站不具有對特定頁面一個統計,認爲值應爲NULL。這導致我認爲我需要在某個地方做一個JOIN/UNION,但是我無法圍繞它進行思考!當我需要多個不同的值時,如何制定此查詢?謝謝!

UPDATE(使用動態SQL + PIVOT ANSWER): PIVOT是正確的方法,其中兩個可能的答案包括在內。由於實際SELECT語句中的值的SUM是獲取動態SQL查詢正常工作的關鍵,因此向第二響應者提供了官方信用。

http://sqlfiddle.com/#!6/7b4cb/37/0

此外,使用了一些TSQL從這裏:

SQL Server Pivot with Dynamic Fields

+0

這些sitenames是靜態列表嗎? –

+0

似乎數據已經存在,這只是一個演示問題。如果我正在爲網頁做這件事,我會對你的表進行排序,並在服務器端Web代碼中進行演示。編輯:由@RohitSingh建議的數據透視表看起來像一個非常好的建議。 – mikeY

+1

假設網站名稱列表各不相同,動態數據透視表可能會按順序排列:http://stackoverflow.com/questions/2209700/how-to-use-pivot-in-sql-server-2005-stored-procedure-joining -two-views –

回答

2

如果網站列表是靜態的,你可以使用透視像這樣

SELECT 
    page, 
    sum(name1) name1, 
    sum(name2) name2, 
    sum(name3) name3 
FROM 

(SELECT id, page, views, sitename 
FROM Table1) p 
PIVOT 
(
    SUM(VIEWS) 
    FOR SiteName IN (name1, name2, name3) 
) as pvt 
GROUP BY 
    page 

SQL Fiddle

如果它需要是動態的,你可以使用這種使用動態sql的技術。

Bluefeet gives an example here

+0

此外,爲什麼列上名稱的SUM在這裏工作,即使它的VARCHAR?在SQL Fiddle中,它不會發出抱怨,但在SQL Server中,它給了我'操作數數據類型varchar對於sum操作符無效'。任何想法如何解決這一問題? – tresstylez

相關問題