Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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不会完全按分组_Sql_Sql Server - Fatal编程技术网

SQL不会完全按分组

SQL不会完全按分组,sql,sql-server,Sql,Sql Server,我有一个SQL代码,最初运行得很好,但后来我不得不在一个案例中添加一个新项目,现在我的分组方式不会像以前那样完全分组在一起,这会扰乱我的计算。我甚至不想按完成日期分组,它只是用于一个案例,但是如果我没有它,我的代码就会崩溃 编辑:原始代码工作得很好,但我必须添加完成日期以便添加案例,如果我不将其添加到GROUP BY,则会出现错误,因此我添加了它,现在它没有按照原始代码中的方式进行分组。 这段代码所做的是从其他表中获取一组信息,它计算某人欠了多少钱,某人付了多少钱,然后把差额吐出来 原始代码 新

我有一个SQL代码,最初运行得很好,但后来我不得不在一个案例中添加一个新项目,现在我的分组方式不会像以前那样完全分组在一起,这会扰乱我的计算。我甚至不想按完成日期分组,它只是用于一个案例,但是如果我没有它,我的代码就会崩溃

编辑:原始代码工作得很好,但我必须添加完成日期以便添加案例,如果我不将其添加到GROUP BY,则会出现错误,因此我添加了它,现在它没有按照原始代码中的方式进行分组。 这段代码所做的是从其他表中获取一组信息,它计算某人欠了多少钱,某人付了多少钱,然后把差额吐出来

原始代码

新代码不能一直工作


我看到您也在按t分组。在新代码中完成,但在原始代码中不完成。你的结果需要考虑到这一点,否则他们将是错误的


对我来说,Isnullcp.TtlPayments,0+Isnullba.Amount,0在您的CASE语句中,但当语句在其他位置使用求和时,它们不是聚合的。我看到您在新代码中也是按t进行分组的。Complete,而不是在原始代码中。你的结果需要考虑到这一点,否则他们将是错误的

对我来说,Isnullcp.TtlPayments,0+Isnullba.Amount,0在您的CASE语句中,但当语句在其他地方使用求和时,它们不是聚合的,这似乎也很奇怪。

如果您不想让Complete影响您的组,您需要在不选择Complete的子查询中执行您的CASE。那么在分组的数据中就没有额外的字段了。像这样:

SELECT [whatever fields]
from
    (
    SELECT t.CustomerId, ys.Name AS Year, 
    CASE 
        WHEN SUM(t.TtlSpeciesCost) < 5 AND t.Complete < CONVERT(DATE,'01-01-2017')
        THEN (5) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
        ELSE SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
    END
    AS TtlOwnerCost, t.YearSetupId AS YearSetupId
    FROM #TotalAnimalCostAll t
    LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID
    LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId
    LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID
    ) as a
GROUP BY a.CustomerId, a.Name,a.TtlPayments, a.Amount, a.YearSetupId 
如果不希望Complete影响您的组,则需要在未选择Complete的子查询中执行案例。那么在分组的数据中就没有额外的字段了。像这样:

SELECT [whatever fields]
from
    (
    SELECT t.CustomerId, ys.Name AS Year, 
    CASE 
        WHEN SUM(t.TtlSpeciesCost) < 5 AND t.Complete < CONVERT(DATE,'01-01-2017')
        THEN (5) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
        ELSE SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
    END
    AS TtlOwnerCost, t.YearSetupId AS YearSetupId
    FROM #TotalAnimalCostAll t
    LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID
    LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId
    LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID
    ) as a
GROUP BY a.CustomerId, a.Name,a.TtlPayments, a.Amount, a.YearSetupId 

我建议你解释一下代码应该做什么。样本数据和期望的结果会有所帮助。非工作代码不一定能很好地传达意图。。。您已通过将t.Complete添加到组中。因此,它不会是相同的分组…选择列表达式中的大小写不能影响同一选择中的分组依据,除非分组依据也已编辑。在本例中,您已经编辑了GROUP BY,这改变了它的行为。我建议您解释一下代码应该做什么。样本数据和期望的结果会有所帮助。非工作代码不一定能很好地传达意图。。。您已通过将t.Complete添加到组中。因此,它不会是相同的分组…选择列表达式中的大小写不能影响同一选择中的分组依据,除非分组依据也已编辑。在本例中,您编辑了分组依据,这改变了它的行为。
SELECT [whatever fields]
from
    (
    SELECT t.CustomerId, ys.Name AS Year, 
    CASE 
        WHEN SUM(t.TtlSpeciesCost) < 5 AND t.Complete < CONVERT(DATE,'01-01-2017')
        THEN (5) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
        ELSE SUM(t.TtlSpeciesCost) - Isnull(cp.TtlPayments,0) + Isnull(ba.Amount,0) 
    END
    AS TtlOwnerCost, t.YearSetupId AS YearSetupId
    FROM #TotalAnimalCostAll t
    LEFT JOIN #CustomerPaymentsAll cp ON t.CustomerId=cp.CustomerID
    LEFT JOIN YearSetup ys ON t.YearSetupId = ys.YearSetupId
    LEFT JOIN #BalanceAdjustmentsAll ba ON t.CustomerId=ba.CustomerID
    ) as a
GROUP BY a.CustomerId, a.Name,a.TtlPayments, a.Amount, a.YearSetupId