我在查询时遇到问题。我希望有人可以帮助我。
假设我有一个类似这样的数据库。
DateandTime PartNum FwVerOrErrDesc Pass
date1 A 1 0
date2 A 1 0
date3 B 1 0
date4 B 3 0
date5 C 2 0
date6 A 3 0
date7 C 1 0
date8 B 2 0
date9 B 1 0
总结我有日期,这个例子中有一种模型A,B和C但是在实际的数据库中我有超过100种不同的模型,在FwVerOrErrDesc上我有一种类型的失败,我又有很多类型的失败,并且Pass表示单位失败。
我想生成一个查询,告诉我在特定故障中有多少单元出现故障,但是,由于在不同模型上存在相同的故障,因此我无法计算故障(FwVerOrErrDesc)并按顺序排序因为我只得到失败的总数让我们说“1”但是所有型号我也希望被模型区分。 (PartNum是模型)
我想要实现的是这样的。
PartNum FwVerOrErrDesc Count
A 1 2
A 3 1
B 1 2
B 2 1
B 3 1
C 1 1
C 2 1
我试过这样的事情:
SELECT
PartNum
, [FwVerOrErrDesc]
, COUNT(FwVerOrErrDesc)
FROM [RceTestwareMfrLog].[dbo].[RceLogData]
WHERE Pass=0 and DateAndTime > DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T06:00:00')
and DateAndTime < DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T14:00:00') and
substring(SerialNum,1,8) <> '11111111'
GROUP BY [PartNum]
但我收到了一个错误。
我希望有人可以帮助我,非常感谢你。
答案 0 :(得分:1)
您需要在Group by子句中包含[FwVerOrErrDesc]列。试试这个
SELECT
PartNum
, [FwVerOrErrDesc]
, COUNT(FwVerOrErrDesc) as [count]
FROM [RceTestwareMfrLog].[dbo].[RceLogData]
WHERE Pass=0 and DateAndTime >
DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T06:00:00')
and DateAndTime < DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T14:00:00')
and
substring(SerialNum,1,8) <> '11111111'
GROUP BY [PartNum],[FwVerOrErrDesc]
答案 1 :(得分:0)
如果我理解正确,我会将查询写成:
SELECT PartNum, FwVerOrErrDesc, COUNT(FwVerOrErrDesc)
FROM [RceTestwareMfrLog].[dbo].[RceLogData]
WHERE Pass = 0 AND
DATEPART(hour, DateAndTime) BETWEEN 6 AND 13 AND
SerialNum NOT LIKE '11111111%'
GROUP BY PartNum, FwVerOrErrDesc;
当然,问题(正如我在评论中提到的)是GROUP BY
中缺少的列。另外:
NOT LIKE
而不是SUBSTRING()
。当模式以非通配符开头时,LIKE
可以使用索引,因此使用模式是个好习惯。cast(DateAndTime as time) between '06:00:00' and '14:00:00'
。