我有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
答案 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行 实际上是你需要的。
现在,如果你想查看所有日期,但是对于某些日期你有垃圾值,那么你需要:
这会给你类似的东西,
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)