SUM FIRST_VALUE或SUM group by仍显示所有行吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SUM FIRST_VALUE或SUM group by仍显示所有行吗?相关的知识,希望对你有一定的参考价值。

我有一个如下表:

InvoiceNum, CreditNum, ItemID,  TotalCreditDetail, TotalCredit, TotalCost, SumCreditDetailTaxed
001       , 001      , ITEM-A,  340              , 20811      , 20894.84 , 340
001       , 002      , ITEM-B,  0                , 20811      , 20894.84 , 20471
001       , 002      , ITEM-C,  4510             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-D,  1424             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-E,  2230             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-F,  5225             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-G,  3400             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-H,  1242             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-I,  2200             , 20811      , 20894.84 , 20471
001       , 002      , ITEM-J,   240             , 20811      , 20894.84 , 20471

[我正在尝试使用“ uncategorizedcredit”获得一列,基本上是与ItemID无关的信用。 TotalCredit是InvoiceNum所独有的,因此我可以通过减去FIRST_VALUE(TotalCredit) OVER (PARTITION BY InvoiceNum) - SUM(TotalCreditDetail) OVER (PARTITION BY InvoiceNum) as UncategorizedCredit来获得此数字吗?我想我可能已经回答了有关如何计算UncategorizedCredit的问题,但是我不确定。我今天才发现FIRST_VALUE。我目前正在使用SUM(CASE WHEN... )进行计算,但是它很杂乱,似乎需要我按SUM()进行分组,然后再取消分组以获取报告所需的所有详细信息。

[之后,我需要对CrystalReports中整个报告的总数求和,即UncategorizedCredit列。这是个棘手的问题,因为该报告按ITEM分组,InvoiceNum 002可能具有ITEM-C和ITEM-D,InvoiceNum 003可能具有ITEM-H和ITEM-I,等等。现在我正在使用变量将报表明细中的数字加到总计中。然后,我想回去,从总计中减去任何未分类的积分。

我的问题是,如何将每个发票值与按ITEM-ID分组的报告相加?我考虑过使用一个数组来存储已经累加的InvoiceNum,但是数组的最大数量为1000,并且此报告中的数量将大大超过该数量。

我想我可以在从上一个选择语句中选择的新选择语句中使用SUM(UncategorizedCredit) OVER() as TotalUncategorizedCredit

我不能使用嵌套选择,因为CrystalReports对数据应用了一个filter / where子句,并且总计将不准确。为了获得TotalCreditDetail和SumCreditDetailTaxed,我目前正在使用〜8-10种各种类型的JOINS,有些RIGHT OUTER JOIN (SELECT * FROM table) ON x = y。我实际上实际上没有SQL,我明天将尝试SUM,但是如果FIRST_VALUE不起作用,那么我不确定还要做什么。

这可能只相当于一千美元的差额,但我正在尝试说明所有问题。

答案
我认为您想要:

select invoicenum, (TotalCredit - sum(TotalCreditDetail)) as uncategorizedCredit from t group by invoicenum, TotalCredit; 实际上实际上不需要

first_value() -因为每一行的值都相同。因此,作为窗口函数,可以这样执行:

select t.*, (max(TotalCredit) over (partition by invoicenum) - sum(TotalCreditDetail) over (partition by invoicenum) ) as uncategorizedCredit from t;

您可以使用first_value()而不是min() / max()-但后者更易于输入。

以上是关于SUM FIRST_VALUE或SUM group by仍显示所有行吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django ORM 中执行 GROUP BY ... COUNT 或 SUM?

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

通过laravel eloquent查询Mysql sum group

LINQ Group使用Lambda通过两个对象属性和SUM,AVG或忽略其他对象属性

子查询或 sum 内的 sum。这是可能的?

GROUP BY 和聚合函数的参数的适当术语,例如 SUM()