Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每行总金额的SUM子查询_Sql - Fatal编程技术网

Sql 每行总金额的SUM子查询

Sql 每行总金额的SUM子查询,sql,Sql,我在支票行表格中有一些信息,基本上分解了各种费用和特定支票的信息。对于这个查询,我想求校验行的总和,但它给出的是所有校验行的总和。我知道我漏掉了一些显而易见的东西,但我一直在琢磨为什么我要个性化计算。我的问题是: SELECT DISTINCT O.FileNumber ,(SELECT DISTINCT SUM(CL.Amount) FROM dbo.Orders O LEFT JOIN dbo.Checks C

我在支票行表格中有一些信息,基本上分解了各种费用和特定支票的信息。对于这个查询,我想求校验行的总和,但它给出的是所有校验行的总和。我知道我漏掉了一些显而易见的东西,但我一直在琢磨为什么我要个性化计算。我的问题是:

SELECT DISTINCT
O.FileNumber
,(SELECT DISTINCT
        SUM(CL.Amount)
    FROM
        dbo.Orders O
        LEFT JOIN dbo.Checks C
            ON O.OrdersID = C.OrdersID
        LEFT JOIN dbo.CheckLine CL
            ON C.ChecksID = CL.ChecksID
) AS 'Total'
FROM
dbo.Orders O
LEFT JOIN dbo.Checks C
    ON O.OrdersID = C.OrdersID
LEFT JOIN dbo.CheckLine CL
    ON C.ChecksID = CL.ChecksID
这就是它所返回的:

| FileNumber  | … | Total |
|     1       |   | 2000  |
|     2       |   | 2000  |
它应该返回的是:

| FileNumber  | … | Total |
|     1       |   | 700   |
|     2       |   | 1300  |

关于我的大脑放屁的想法?谢谢大家

您可能想要这样:

SELECT O.FileNumber, SUM(CL.Amount) as total
  FROM dbo.Orders O
  LEFT JOIN dbo.Checks C
    ON O.OrdersID = C.OrdersID
  LEFT JOIN dbo.CheckLine CL
    ON C.ChecksID = CL.ChecksID
 group by O.FileNumber
在子查询中计算
Total
时,SQL Server会将该值视为常量,并重复每一行

GROUP BY
DISTINCT
混淆是很常见的(请查看和),因为如果
SELECT
子句中没有聚合函数,它们返回相同的值。在您的示例中:

SELECT DISTINCT FileNumber FROM ORDERS 
将返回相同的

SELECT FileNumber FROM ORDERS GROUP BY FileNumber

如果您希望聚合信息(如您的字段
总计
),请使用
分组依据

问题在于,我还选择了其他字段,因此当我尝试
分组依据
时,我收到聚合错误:“
列'dbo.Orders.CloseDate'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
“这就是我尝试执行子查询的原因。黄金法则是:
SELECT
中未聚合的每一列都应位于
groupby
中。我已编辑了我的答案以回答您的评论。您想知道每个文件号和关闭日期的总和吗?如果是这样,查询中的版本将解决您的问题。如果没有,您可能也希望使用
MAX
MIN
函数聚合
CloseDate
。谢谢@Nizam。因为我选择了多个字段,所以我最终按照文件号和CloseDate进行分组,并将一个
MAX()
聚合放置到我的每个其他选择字段中,因为这些字段都只是重复。我感谢你的帮助!
SELECT FileNumber FROM ORDERS GROUP BY FileNumber