sql - 使用 0 值而不是 NULL 构建矩阵
问题描述
我将我的网站谷歌分析结果存储在一个包含这些列的表中:
date domain source session_count
2020-04-06 xyz.com organic search 50
2020-04-07 123.net direct 40
前 3 列是复合键。
有不同的组合缺少数据,因为在那天或在那个特定来源中没有任何页面浏览量。
我想构建一个矩阵视图,其中所有日期、所有域、所有源都显示session_count
,如果没有,最好0
用ISNULL
函数显示。
我有一个单独的日期维度表,我加入(完全外连接),然后我可以看到所有日期(即使是没有任何条目的日期),但是缺少不同的域和不同的来源。
示例输出:
date domain source session_count
2020-04-05 xyz.com organic search 0
2020-04-05 xyz.com direct 0
2020-04-05 123.net organic search 0
2020-04-05 123.net direct 0
2020-04-06 xyz.com organic search 50
2020-04-06 xyz.com direct 0
2020-04-06 123.net organic search 0
2020-04-06 123.net direct 0
请帮我实现这个观点。
解决方案
要返回所有可能的组合,除了日期维度表之外,您还需要域和源表。
如果没有它们,您可以先在 CTE 上计算它们,得到相同的结果,尽管性能会更慢:
假设您的日期维度表称为日历,而您的谷歌分析结果表称为 GoogleData,那么您的查询将是:
with Domains as (
select distinct domain
from GoogleData
),
Sources as (
select distinct source
from GoogleData
)
select Calendar.date, Domains.domain, Sources.source,
isnull(GoogleData.session_count, 0) as session_count
from Calendar
cross join Domains
cross join Sources
left join GoogleData on GoogleData.date = Calendar.date and
GoogleData.domain = Domains.domain and
GoogleData.source = Sources.source
推荐阅读
- javascript - Mongoose 更新多个子文档
- mysql - 在不同的表中使用相同的字段名然后进行联合查询有什么问题吗?
- python - SQLAlchemy:使用给定数组中的元素查询数据库列
- angularjs - md-tabs 不显示滚动或分页
- node.js - Nodejs Cheerio DOM 解析器:有没有办法选择特定范围的元素?
- python - DDPG(Actor-Critic)跑到最小值/最大值
- c# - 如何查询特定日期的 EventLog?
- ruby-on-rails - Rails:如何在重定向时保留对象错误
- amazon-web-services - aws Kinesis steam 可以用作优先级队列吗?
- php - 为什么 PHP 会自动调用 Index 类中的 index 方法?