Sql 计算列中的每个值

Sql 计算列中的每个值,sql,sql-server,Sql,Sql Server,我很难提出问题。我希望有人能帮助我 假设我有一个类似这样的数据库 DateandTime PartNum FwVerOrErrDesc Pass date1 A 1 0 date2 A 1 0 date3 B 1 0 date4 B 3 0 date5

我很难提出问题。我希望有人能帮助我

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

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
PartNum  FwVerOrErrDesc  Count
   A           1           2
   A           3           1
   B           1           2
   B           2           1
   B           3           1
   C           1           1
   C           2           1
总结一下,我有日期,本例中的模型类型a、B和C,但在实际数据库中,我有100多个不同的模型,在FwVerOrErrDesc上,我有一种类型的故障,同样,我有许多类型的故障,通过表示机组故障

我想生成一个查询,告诉我在一个特定的故障中有多少个单元发生了故障,但是,由于在不同的模型上有相同的故障,我无法计算故障数(FwVerOrErrDesc)并按它们排序,因为我只得到了故障总数,比如说“1”但是在所有的模型中,我也想被模型所区别。(PartNum为模型)

我想要达到的是这样的目标

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
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]
选择
帕纳姆
,[FwVerOrErrDesc]
,计数(FwVerOrErrDesc)
来自[RceTestwareMfrLog]。[dbo]。[RceLogData]
其中Pass=0,DateAndTime>DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T06:00:00')
和DateAndTime
但我犯了个错误


我希望有人能帮助我,非常感谢您的帮助。

您需要在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]
选择
帕纳姆
,[FwVerOrErrDesc]
,计数(FwVerOrErrDesc)为[计数]
来自[RceTestwareMfrLog]。[dbo]。[RceLogData]
其中Pass=0,DateAndTime>
DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T06:00:00')
和DateAndTime
如果我理解正确,我会将查询写为:

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;
当然,问题(正如我在评论中提到的)是
组中缺少的列。此外:

  • 这将使用
    而不是
    子字符串()
    <当模式以非通配符开头时,code>LIKE
    可以使用索引,因此使用模式是一个好习惯
  • 这将明确提取时间比较的小时数。您还可以在'06:00:00'和'14:00:00'之间执行类似于
    的操作(日期和时间为时间)

你错过了
组中的
fverorerrdesc
。我现在觉得自己很傻,哈哈,很简单,但我想不出来。非常感谢。你帮了我很大的忙。祝你今天愉快。谢谢你,我会考虑你的建议。祝您有个美好的一天。