从表A中选择值并计算表B中的相应值

时间:2012-09-21 10:06:57

标签: sql tsql

我有一个问题,我无法真正看到如何工作,我已根据调查结果尝试了一些事情 谷歌,但无济于事。我希望这里有人可以提供帮助。

我有两个表(A和B),表AI中有一些我想要选择的概述数据,而表BI中有与表A相对应的详细信息(加入两个参数),但表B中的数据只有需要总结行数。

我有这个问题:

SELECT s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID,
   COUNT(b.*) AS nRows
         FROM tblA s LEFT OUTER JOIN tblB p
         ON s.CartID = p.CartID AND s.SendDate = p.CartDate
         WHERE s.Client='3' AND s.SendDate BETWEEN '2012-09-01' AND '2012-09-07'

但是,这只会出现以下错误:

''附近的语法不正确。*

我也试过使用这个COUNT(b.PackageID),但后来我得到了:

列'tblA.CartID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我真的不知道如何在一个查询中获取这些数据。

任何帮助将不胜感激。 :)

2 个答案:

答案 0 :(得分:0)

该错误告诉您需要将SELECT中的所有字段添加到GROUP BY或这样的聚合:

SELECT s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID,
   COUNT(p.*) AS nRows  -- I am guessing this should be p not b
FROM tblA s 
LEFT OUTER JOIN tblB p
  ON s.CartID = p.CartID 
  AND s.SendDate = p.CartDate
WHERE s.Client='3' 
  AND s.SendDate BETWEEN '2012-09-01' AND '2012-09-07'
GROUP BY s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID

如果您不想GROUP BY所有这些字段,那么您还可以使用与此类似的子查询:

SELECT s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID,
   p.Cnt as nRows
FROM tblA s 
LEFT OUTER JOIN
(
  SELECT COUNT(*) cnt, CartID, PackageID, CartDate
  FROM tblB
  GROUP BY CartID, PackageID, CartDate
) p
  ON s.CartID = p.CartID 
  AND s.SendDate = p.CartDate
WHERE s.Client='3' 
  AND s.SendDate BETWEEN '2012-09-01' AND '2012-09-07'

答案 1 :(得分:0)

你可能用p。打错了b 对于COUNT,您可以使用GROUP BY:

SELECT 
   s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID,
   COUNT(p.*) AS nRows
FROM 
    tblA s LEFT OUTER JOIN tblB p
    ON s.CartID = p.CartID AND s.SendDate = p.CartDate
 WHERE 
    s.Client='3' AND 
    s.SendDate BETWEEN '2012-09-01' AND '2012-09-07'
GROUP BY
   s.CartID,
   s.Sender,
   s.Destination,
   s.CartType,
   s.SendDate,
   p.PackageID,
   p.CartID,