为SQL Server中的表中的每个2 DISTINCT列选择行

时间:2013-06-18 18:01:31

标签: sql sql-server tsql pivot

我有一个表,有多个网站有数千行日志统计信息(每个网页的每个页面的浏览量)。例如,在此表中,多个站点可以具有相同页面名称的单独统计信息:

+----+---------+-------+------------+
| 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,但是我无法绕过它!当我需要多个不同的值时,如何制定此查询?谢谢!

更新(带有动态SQL + PIVOT的答案): PIVOT是正确的方法,包括潜在的答案。由于实际SELECT语句中的值的SUM是使动态SQL查询正常工作的关键,因此给第二响应者提供了正式的功劳。

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

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

SQL Server Pivot with Dynamic Fields

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)