如何在SQL Server中汇总客户数量?

时间:2018-08-10 10:40:31

标签: sql sql-server aggregate data-warehouse

我有这样的交易数据:

| 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_TransactionsTotal_Dollars都很有效,但对Total_Customers则无效。

“天”表中的Total_Customers数字在每一行中都是正确的,对于YearMonthDayDepartment和{ {1}},但是将这些行中的两行相加时,总计将变得不准确,因为同一位客户可能在同一日期使用不同的Pay_MethodDepartment(s)进行了多次交易。将天数相加以获得每月客户数量等时,数字变得更加不准确。

我认为解决方案是尝试诱使SQL Server将“所有”视为各种“分组依据”字段的可能值,然后对分组依据和大小写进行相当多的处理,但无法弄清楚。本质上,除了我的“天”表包含年,月,Pay_Method(s)DayDepartment的每个特定组合之外,我还需要生成行,其中Pay_Method,{{ 1}},YearMonthDay被视为“任何”或“全部”。最后,我不需要生成其中Department为“ any”并且指定了Pay_MethodYear的行(尽管实际上并没有什么坏处),因为没有人关心总数每年3月7日等...

有人可以帮我编写查询以正确填充我的Month表吗?

1 个答案:

答案 0 :(得分:0)

您的问题是因为模型的“纹理”错误。谷物是事实表中详细程度的术语。

您始终希望以最详细的信息存储事实,然后才能正确汇总数据。那时您已经有了第一张桌子。

与其将数据(不正确地)汇总到第二张表中,不如简单地重写或修改该表以将日期/时间分成报告所需的字段。

顺便说一句,如果这确实代表您的数据,我怀疑您实际上可能在交易计数中隐藏了错误。您可能需要比“部门”更好的详细程度,而且我怀疑这可能是“产品”之类的概念。如果客户同时购买了苹果和橙子,那么您的模型会怎样?