sql - SQL 查询优化:在事实表中两次使用相同指标的最佳方法是什么?
问题描述
我有一个维度表,其中包含业务部门和员工姓名,如下所示。
表:昏暗
business | emp_name
-----------|-----------
sales | A
sales | B
marketing | C
product | D
IT | E
此外,包含员工之间交易的事实表如下。
表: fct
client_emp_name | provider_emp_name | value
-----------------|--------------------|--------
A | C | 10
C | D | 5
C | B | 10
我想编写一个查询来查找每个业务作为客户和提供商(包括没有交易的业务单位)
所需结果的总和
business | provider_total_value | client_total_value
-----------|-----------------------|---------------------
sales | 10 | 10
marketing | 15 | 0
product | 0 | 5
IT | 0 | 0
为这种情况构建 SQL 查询的最佳方法是什么?我有以下查询可以提供准确的结果,但我不确定它是否是解决此问题的最佳方法。
With provider as (
SELECT
d.business,
SUM(f.value) as provider_total_value
FROM fct as f
right join dimension as d on d.emp_name = f.provider_emp_name
Group by 1
),
client as (
SELECT
d.business,
SUM(f.value) as client_total_value
FROM fct as f
right join dimension as d on d.emp_name = f.client_emp_name
Group by 1
)
Select
p.business,
COALESCE(p.provider_total_value, 0) as provider_total_value,
COALESCE(c.client_total_value, 0) as client_total_value
From provider as p
Inner join client as c on c.business = p.business
谢谢!
解决方案
您也可以为交易表提供架构吗?
我认为您编写的查询是有效的。为了进一步改进,我将对主键(业务)使用整数数据类型,而不是字符/字符串数据类型。
推荐阅读
- node.js - Docker MACVLAN 端口未正确映射
- eclipse - 如何更改具有显着偏差的分支?
- javascript - 高效地使用 map 函数渲染许多 React 组件
- intellij-idea - 如何为 IntelliJ 制作简单的计算器语法高亮显示?
- python - for循环根据“n”围绕“x”创建一个列表
- ios - 如果表行中的某些值被更新,如何切换到另一个视图控制器?
- javascript - 如何在道具验证器中访问“this”
- java - Java 方法参数给出编译错误“Unexpected bound”
- asp.net - 垃圾回收正在进行时无法分析托管堆
- python-3.x - 我将如何使用来自两个域的 cookie?