查询不返回所有结果

时间:2012-07-06 18:18:03

标签: sql sql-server select group-by average

我有881行,下面的查询应返回,但只返回744:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

现在,如果我分别运行这两个查询,我分别得到588和293,等于我需要的881:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

上述语句的主要区别是WHERE语句。

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

这里也有相同的关键差异,期待请注意区别在于IS NULL为空,而另一个IS NOT NULL

现在有人为什么会这样?我可能的错误是什么导致首先提到的查询不返回所有881结果?

数据库管理器:SQL Server 2008 R2和SSMS 日期格式(如有必要):YYYY-MM-DD HH:MM:SS.000

3 个答案:

答案 0 :(得分:3)

您有以下组合:

DATEPART(HH,DateTime),DATEPART(DD,DateTime)

其中DATEPART(HH,DateTime),DATEPART(DD,DateTime)同时具有NULL值而非NULL值。

换句话说,由两个单独的查询定义的组重叠。

答案 1 :(得分:2)

你真的确定HH,DD和NULL(SCR1_EXHAUST)的组合是唯一的吗?

如果两行,即使它们具有不同的DateTimes,但仍设法具有相同的HH和DD,并且其中一行具有NULL SCR1_EXHAUST_GAS_TEMP而另一行具有相同的空值,则GROUP BY将它们合并为一行。

在这种情况下,您还需要对ISNULL(SCR1_EXHAUST_GAS_TEMP)进行分组。

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY ISNULL(SCR1_EXHAUST_GAS_TEMP, 0)=0, DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

...或者,也许744行 实际上是你需要的。

现在,如果你想查看所有日期,但是对于某些日期你有垃圾值,那么你需要:

  • 通过提取YYYY,MM,DD,HH的不同值来准备第一套,这将是您的“日历”
  • 准备第二组,您将在其中平均非空的临时值,在YYYY,MM,DD和HH上进行分组
  • LEFT使用数据加入日历,加入YYYY,MM,DD和HH并获得这些,加上TEMP,并按y,m,d,h排序。

这会给你类似的东西,

Year Mo Da HH Temp
2012 07 07 00  750
2012 07 07 01  633
2012 07 07 02  NULL    <-- from 02:00 to 02:59 we only have junk!
2012 07 07 03  660     (actually, when going from summer time to winter time...)
2012 07 07 04  680

答案 2 :(得分:1)

以下查询应显示2组中重叠的行:

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)

intersect

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)