我有一个表,有多个网站有数千行日志统计信息(每个网页的每个页面的浏览量)。例如,在此表中,多个站点可以具有相同页面名称的单独统计信息:
+----+---------+-------+------------+
| 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:
答案 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的技术。
答案 1 :(得分:1)