我有这样的交易数据:
| Time_Stamp | Customer_ID | Amount | Department | Pay_Method | Channel |
|---------------------|-------------|--------|------------|-------------|------------|
| 2018-03-07 14:23:33 | 374856829 | 14.63 | Fruit | Credit Card | Mobile App |
我编写了这样的聚合过程:
INSERT INTO Days
(
Year,
Month,
Day,
Department,
Pay_Method,
Total_Dollars,
Total_Transactions,
Total_Customers
)
SELECT
YEAR(Time_Stamp),
MONTH(Time_Stamp),
DAY(Time_Stamp),
Department,
Pay_Method,
SUM(Amount),
COUNT(*),
COUNT(DISTINCT(Customer_ID))
FROM
Transactions
GROUP BY
YEAR(Time_Stamp),
MONTH(Time_Stamp),
DAY(Time_Stamp),
Department,
Pay_Method
像这样填充数据集市表的
| Year | Month | Day | Department | Pay_Method | Total_Dollars | Total_Transactions | Total_Customers |
|------|-------|-----|------------|------------|---------------|--------------------|-----------------|
| 2018 | 3 | 7 | Home | Cash | 2398540.57 | 543084 | 325783 |
| 2018 | 3 | 7 | Home | Credit | 7458392.47 | 1587695 | 758643 |
到目前为止,很好。
然后我有一些程序可以像这样馈送图表UI:
SELECT
Year,
Month,
Day,
SUM(Total_Dollars),
SUM(Total_Transactions),
SUM(Total_Customers)
FROM
Days
WHERE
IIF(@Department IS NULL, Department, @Department) AND
IIF(@Pay_Method IS NULL, Pay_Method, @Pay_Method)
GROUP BY
Year,
Month,
Day
这一切对Total_Transactions
和Total_Dollars
都很有效,但对Total_Customers
则无效。
“天”表中的Total_Customers
数字在每一行中都是正确的,对于Year
,Month
,Day
,Department
和{ {1}},但是将这些行中的两行相加时,总计将变得不准确,因为同一位客户可能在同一日期使用不同的Pay_Method
和Department(s)
进行了多次交易。将天数相加以获得每月客户数量等时,数字变得更加不准确。
我认为解决方案是尝试诱使SQL Server将“所有”视为各种“分组依据”字段的可能值,然后对分组依据和大小写进行相当多的处理,但无法弄清楚。本质上,除了我的“天”表包含年,月,Pay_Method(s)
,Day
和Department
的每个特定组合之外,我还需要生成行,其中Pay_Method
,{{ 1}},Year
,Month
和Day
被视为“任何”或“全部”。最后,我不需要生成其中Department
为“ any”并且指定了Pay_Method
和Year
的行(尽管实际上并没有什么坏处),因为没有人关心总数每年3月7日等...
有人可以帮我编写查询以正确填充我的Month
表吗?
答案 0 :(得分:0)
您的问题是因为模型的“纹理”错误。谷物是事实表中详细程度的术语。
您始终希望以最详细的信息存储事实,然后才能正确汇总数据。那时您已经有了第一张桌子。
与其将数据(不正确地)汇总到第二张表中,不如简单地重写或修改该表以将日期/时间分成报告所需的字段。
顺便说一句,如果这确实代表您的数据,我怀疑您实际上可能在交易计数中隐藏了错误。您可能需要比“部门”更好的详细程度,而且我怀疑这可能是“产品”之类的概念。如果客户同时购买了苹果和橙子,那么您的模型会怎样?