1

我有一个表,其中包含多个网站的数千行日志统计信息(每页,每个网站的查看次数)。例如,在此表中,多个站点可以对同一页面名称具有单独的统计信息:

+----+---------+-------+------------+
| 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    |
+----+---------+-------+------------+

我正在尝试制定一个查询,该查询将允许我为每个 DISTINCT 站点名称列出每个 DISTINCT 页面名称 - 并显示每个站点该页面的查看次数:

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

如果站点没有该特定页面的统计信息,则视图值应为 NULL。这让我觉得我需要在某个地方做一个 JOIN/UNION,但我不能把它包起来!当我需要多个不同的值时,如何制定此查询?谢谢!

UPDATE (ANSWER WITH DYNAMIC SQL + PIVOT): PIVOT 是正确的方法,这两个潜在的答案都包括在内。由于实际 SELECT 语句中的值的总和是使动态 SQL 查询正常工作的关键,因此将官方归功于第二响应者。

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

此外,从这里使用了一些 TSQL:

具有动态字段的 SQL Server Pivot

4

2 回答 2

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小提琴

如果它需要是动态的,您可以使用这种使用动态 sql 的技术。

Bluefeet 在这里举了一个例子

于 2013-06-18T18:10:50.410 回答
1

您可以将 Pivot 功能用于上述场景。请在下面找到实现:

http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-非数据透视表示例/

于 2013-06-18T18:08:47.697 回答