评估列中的每个值

时间:2017-05-25 11:44:23

标签: sql sql-server

我在查询时遇到问题。我希望有人可以帮助我。

假设我有一个类似这样的数据库。

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]

但我收到了一个错误。

我希望有人可以帮助我,非常感谢你。

2 个答案:

答案 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'
  • 之类的操作