首页 > 解决方案 > 使用 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,如果没有,最好0ISNULL函数显示。

我有一个单独的日期维度表,我加入(完全外连接),然后我可以看到所有日期(即使是没有任何条目的日期),但是缺少不同的域和不同的来源。

示例输出:

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

请帮我实现这个观点。

标签: sqlsql-server

解决方案


要返回所有可能的组合,除了日期维度表之外,您还需要域和源表。

如果没有它们,您可以先在 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

推荐阅读