我对数据库和SQL很新,并且有一项非常重要的任务,我不知道如何解决。
鉴于我有一家公司(A公司)有三个不同的子公司(Sub A,Sub B,Sub C)。这三家子公司生产相同的产品,可分为三类产品:
我的任务是创建一个星型方案,使我能够获得以下信息:产品类别B中每个产品的Sub A和Sub B的总收入。
结果所需的格式是一个包含三列的表格"子公司名称","产品名称"和"收入"。
到目前为止,我一直在尝试做的是创建以下Fact Table,Dimension和Keys。 维度的主键连接到我的事实表的外键。
所以我的问题是:
我是在正确的轨道上还是这种做法完全错了?
我将如何实际填充"我的表与示例数据能够编写一个回答上述给定问题的查询?
这样的查询怎么样?
目前,我使用的是使用XAMPP创建的本地MySQL服务器,并使用IntelliJ IDEA Ultimate 2016进行连接。上面的图表也是使用此软件创建的。
我希望有人能够并愿意帮助我。
另外,请原谅任何错误(或者请告诉我我做错了什么),因为我既是SQL的新手,也是Stackoverflow的新手。
亲切的问候
编辑:
我使用了不同的工具来创建和可视化我的表格。另外,正如fenix所提到的,我添加了几个不同的维度,例如时间/日期表。但是,为了解决我的任务,我想我只需要两个Dimensions dimCompany(代表不同的子公司)和dimProduct。
答案 0 :(得分:1)
RANDBETWEEN
函数在Excel中创建一些示例数据。 SELECT dp.ProductName,sum(fs.revenue) as total_revenue
FROM fact_sales fs
JOIN dim_product dp ON fs.FK_Product = dp.PK_Product
JOIN dim_company dc ON fs.FK_Company = dc.PK_Company
WHERE dp.Product_Type = 'Product Category B'
AND dc.CompanyName IN ('Sub A','Sub B')
GROUP BY dp.PK_Product;
不幸的是,某些数据集市的结构不完善,因此它不包含参照完整性(反模式),因此您必须使用LEFT JOIN
而不是INNER JOIN
。请注意,INNER JOIN
与JOIN
相同。关于JOIN
您可以看到here。
编辑:
关于你的评论,很难平衡不要使这个答案过于宽泛,因为这个QA网站应该用于特定的问题和答案。
由于DWH仍然是一个数据库,它继承了大多数数据库原则。其中一个是表键。主键是唯一行标识符,当数据库设计允许时(在DWH世界中它始终应该是),键是整数(大整数)。有关详细信息,请参阅this。
目的?您可以拥有两个名称相同但状态不同的公司,因此您需要一些密钥来区分它们。
为什么它应该是整数?这是一个更技术性的问题,一个的答案是查询优化。 CPU将比100个字节(或者你指定的)更快地匹配两个整数(4或8个字节)而不是字符串(数据库世界中的VARCHAR
)。
为什么有人使用VARCHAR
作为主键?好吧,有时候,尽可能保持原生是好方法。因此,VARCHAR
产品的主键可以是产品品牌和计数器(来自供应商)的组合,如果您是转售商,ERP可以提供 Microsoft Office 2016 键,如 MCR-OFF-123 。在DWH中,建议存储本机密钥(无论是什么,int或varchar)并分配代理主键。
Sub A的键为'1',Sub B的键为'2
引用您的评论。
是的,你是对的。