【发布时间】:2018-03-10 01:52:00
【问题描述】:
在下面的查询中,我正在计算两个不同日期之间的提前期,并最终尝试获取该提前期的平均值,但输出不正确。
SELECT
Round(AVG(CAST(
Case when CONVERT(datetime, ORDERDATE, 105) = CONVERT(datetime, INVOUTDATE, 105) THEN 0 else
Case when CONVERT(datetime, ORDERDATE, 105) + 1 = CONVERT(datetime, INVOUTDATE, 105) THEN 1 else
(DATEDIFF(dd, CONVERT(datetime, ORDERDATE, 105), CONVERT(datetime, INVOUTDATE, 105)))
-(DATEDIFF(wk, CONVERT(datetime, ORDERDATE, 105), CONVERT(datetime, INVOUTDATE, 105))*1)
-(CASE WHEN DATENAME(dw, CONVERT(datetime, ORDERDATE, 105)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, CONVERT(datetime, INVOUTDATE, 105)) = 'Sunday' THEN 0 ELSE 0 END) end end AS FLOAT)),4) AS LEADTIME FROM DSORDERSTATUS
WHERE ORDERTYPE <> 'Exchange Order'
AND CONVERT(datetime, ORDERDATE, 105) between '20170801' and '20170831'
AND CONVERT(datetime, INVOUTDATE, 105) IS NOT NULL
为了解决上述查询,我使用下面的相同查询提取数据,当我手动计算提前期并取平均值时,它是正确的。 不知道问题出在哪里?有人可以告诉我我的查询是否有问题。 请点击链接参考样本数据Link
SELECT DISTINCT DOCKETNO,
Case when CONVERT(datetime, ORDERDATE, 105) = CONVERT(datetime, INVOUTDATE, 105) THEN 0 else
Case when CONVERT(datetime, ORDERDATE, 105) + 1 = CONVERT(datetime, INVOUTDATE, 105) THEN 1 else
(DATEDIFF(dd, CONVERT(datetime, ORDERDATE, 105), CONVERT(datetime, INVOUTDATE, 105)))
-(DATEDIFF(wk, CONVERT(datetime, ORDERDATE, 105), CONVERT(datetime, INVOUTDATE, 105))*1)
-(CASE WHEN DATENAME(dw, CONVERT(datetime, ORDERDATE, 105)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, CONVERT(datetime, INVOUTDATE, 105)) = 'Sunday' THEN 0 ELSE 0 END) end end AS LEADTIME FROM DSORDERSTATUS
WHERE ORDERTYPE <> 'Exchange Order'
AND CONVERT(datetime, ORDERDATE, 105) between '20170801' and '20170831'
AND CONVERT(datetime, INVOUTDATE, 105) IS NOT NULL
【问题讨论】:
-
输出不正确怎么办?请添加示例数据、预期输出和实际输出。
-
数据文件很大。预期的输出是 1.3078,但我得到的是 1.4328。此外,当我使用相同的查询手动计算时,我得到了正确的输出
-
你能创建一个同样问题的小数据样本吗?
-
您正在使用
select distinct提取数据。您正在取所有数据的平均值。两个数据集不等价。 -
在你的数据中还有DISTINCT子句,删除它并生成一个新的xlsx,请使用这个查询
SELECT DISTINCT ORDERDATE, INVOUTDATE FROM DSORDERSTATUS WHERE ORDERTYPE <> 'Exchange Order' AND CONVERT(datetime, ORDERDATE, 105) between '20170801' and '20170808' AND CONVERT(datetime, INVOUTDATE, 105) IS NOT NULL
标签: sql sql-server vba sql-server-2008 average