【发布时间】:2019-11-07 03:45:38
【问题描述】:
我正在尝试创建一个查询,该查询返回客户订单的结果(在一个月内创建,例如 1 月)-该月取消的客户订单(1 月份取消的客户订单)并显示按以下方式分组的结果位置(行)和按年份和月份(列)。
目前我有一个表格,其中包含所有创建和取消的客户订单信息。每个客户订单都有唯一的订单号、销售地点、创建日期和取消日期。如果客户订单仍然有效,则取消日期将为空或“//”。如果客户订单被取消,那么它将有一个取消日期。作为一些附加信息,可以在 2019 年 1 月创建客户订单,并在 7 月或 8 月或 12 月等取消。我想通过一个月的总客户订单获得所有月份的净客户订单 - 取消的客户该月和特定位置的订单 = 该位置该月的净客户订单。
为了实现这一点,我尝试从表中创建两个单独的查询,第一个包含所有有效的客户订单,第二个包含所有取消。然后我尝试在其他两个查询之间创建一个交叉表,尝试计算我上面提到的内容,按位置分组,然后旋转年份和月份。
使用名为 cust_valid(简化)的有效客户订单的第一个查询:
SELECT cust_ords.[SaleLoc], cust_ords.[OrderNum], cust_ords.[CreationDate], cust_ords.[CancelDate]
FROM cust_ords
WHERE cust_ords.[CancelDate] = "" OR cust_ords.[CancelDate] = "//";
名为 cust_cancelled(简化)的已取消客户订单的第二次查询:
SELECT cust_ords.[SaleLoc], cust_ords.[OrderNum], cust_ords.[CreationDate], cust_ords.[CancelDate]
FROM cust_ords
WHERE cust_ords.[CancelDate] <> "" OR cust_ords.[CancelDate] <> "//";
最后,它们之间的交叉表:
TRANSFORM Count(cust_valid.[OrderNum]) AS [NetOrderCount]
SELECT cust_valid.[SaleLoc]
FROM cust_valid LEFT JOIN cust_cancelled ON cust_valid.[CreationDate] = cust_cancelled.[CancelDate]
WHERE cust_valid.[CreationDate] = cust_cancelled.[CancelDate]
GROUP BY cust_ords.[SaleLoc]
PIVOT cust_valid.[CreationDate];
从这个意义上说,我试图获取(计算)每个给定位置的净客户订单(一个月内创建的总数 - 该月取消的订单)并显示每个月的结果(基本上列名应该是年和月)。因此,例如,如果我在 1 月份有 10 个客户订单,2 月份有 5 个客户订单,3 月份有 15 个客户订单,如果 1 月份的 3 个订单在 3 月份被取消,那么我想计算 3 月 15 日至 3 月的月份,从而结束1 月 10 日、2 月 5 日、3 月 12 日。
【问题讨论】:
-
CreationDateandCancelDate存储为字符串而不是日期/时间,因为它们可以包含`\`?
标签: sql tsql ms-access crosstab