【发布时间】:2016-09-23 01:13:09
【问题描述】:
我有以下查询,可以显示任何特定日期所需的所有正确结果。但是,我的客户希望能够一次搜索任何一个月,避免单独选择一个月中的每一天。我假设我能够转换日期的一部分(月+年),将其转换为另一种格式,然后使用它。当前显示为 05/2016 (103),但我需要能够搜索为 2016-05% (120) 才能显示结果。 代码将放置在 Access VBA 表单中。
SELECT
os.shop, os.prefix,
Rep_date AS FDate,
SUM(RC) AS Fulfilled,
SUM(RF) AS Refunded,
SUM(OS) AS TotalOS,
SUM(CA) AS TotalCA,
SUM(RET) AS TotalRET,
SUM(LOST) AS TotalLOST,
SUM(SHOR) AS TotalSHOR,
SUM(Total) AS Total,
CAST((CAST(SUM(RC) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RCPC,
CAST((CAST(SUM(RF) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RFPC,
CAST((CAST(SUM(OS) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS OSPC,
CAST((CAST(SUM(CA) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS CAPC,
CAST((CAST(SUM(RET) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RETPC,
CAST((CAST(SUM(LOST) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS LOSTPC,
CAST((CAST(SUM(SHOR) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS SHORPC,
SUM(Orders) AS TotalOrders,
SUM(AmazonShipped) AS AmazonShipped,
SUM(AmazonCancelled) AS AmazonCancelled,
SUM(AmazonUnshipped) AS AmazonUnshipped,
CAST((CAST(SUM(AmazonShipped) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonShippedPC,
CAST((CAST(SUM(AmazonCancelled) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonCancelledPC,
CAST((CAST(SUM(AmazonUnshipped) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonUnshippedPC,
p.Description
FROM
OrderStatusSummary os
LEFT JOIN
Prefix p ON os.prefix = p.prefix
GROUP BY
Rep_date, os.shop, os.prefix, p.Description
HAVING
(CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) = CONVERT(DATETIME, '25/05/2016', 103))
ORDER BY
CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) DESC
以上内容是按完整日期搜索的一种方式,以下是我尝试使用的仅按月/年搜索的内容,以向您展示我想要实现的目标。但是它不起作用。
HAVING (RIGHT(CONVERT(nvarchar(10), Rep_date, 103),7) = '05/2016')
我更改的唯一部分代码是与顶部块相比的 HAVING。
【问题讨论】:
-
HAVING子句用于聚合函数条件。也许您应该有一个派生表(或 cte)? -
很遗憾,我无法控制表格更改。
-
派生表只是一个带有别名的子查询。
-
派生表和 cte 是 SQL 结构,用于简化查询。
-
如果
Rep_date是date(time(2))数据类型,为什么不简单地使用where MONTH(Rep_date) = 5 AND YEAR(Rep_date) = 2016?
标签: sql vba sql-server-2008 ms-access sql-server-2008-r2