Group BY的复杂SQL查询

时间:2016-07-09 17:59:10

标签: sql

我有4张桌子(牛,农场,疫苗,vReminder) 我想从Vaccine Reminder表中选择所有提醒显示为

(2(奶牛)在此日期(农场名称1)有(疫苗名称1)) (3)(马)在此日期(农场名1)有(疫苗名1) (1)(牛)在此日期(农场名称2)有(疫苗名称5),依此类推。

我写了这个查询但是如果牛是同一类型的话,它不会对同一个农场的同一疫苗类型进行分组: enter image description here

我的查询:

  SELECT 
  (Select v.vName from vaccine as v where v.vID= vr.[vID]),
  vr.[Type],
  vsD,
  COUNT(vr.[Type]),
  f.farmName
  FROM [QNFARM].[dbo].[vReminder] as vr  inner join
       [cattle] as c on c.RFID = vr.RFID inner join
       farm as f on f.farmID = c.fID    
  Group by
  vr.vID,
  vr.Type,
  vsD,
  vr.RFID,
  f.farmName

但正如你在屏幕截图中看到的那样,对于相同的品种和相同的日期和同一个农场它是Vname Pinkeye它不会将它们归为一组。

2 个答案:

答案 0 :(得分:0)

我正在通过RFID对牛群进行分组的问题阻止群​​体功能收集相同的疫苗ID,所以正确的查询是:

  SELECT f.farmName,vr.[Type],
  (Select v.vName from vaccine as v where v.vID= vr.[vID]) as vName,vr.vsD
  ,COUNT(*) as Num
  FROM [QNFARM].[dbo].[vReminder] as vr inner join  [cattle] as c on c.RFID=vr.RFID  inner join farm as f on f.farmID=c.fID    Group by f.farmName,vr.Type,vr.vID,vr.vsD

我现在只从声明和结果中删除RFID enter image description here

答案 1 :(得分:0)

不要使用子查询来获取疫苗名称。只需使用连接:

SELECT v.vName, vr.[Type], vsD, COUNT(*), f.farmName
FROM [QNFARM].[dbo].[vReminder] vr INNER JOIN
     [cattle] c 
     ON c.RFID = vr.RFID  INNER JOIN 
     farm f 
     ON f.farmID = c.fID INNER JOIN
     vaccine v
     ON v.vid = vr.vid
GROUP BY v.vname, vr.Type, vsD, f.farmName;