无法将两个SQL语句与运行总数组合

无法将两个SQL语句与运行总数组合,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在组合这两个SQL语句时遇到问题: SELECT A.PayeeID, A.Date, Sum(A.PermCashAmt), A.Currency, Year(A.Date) as Year_Occured FROM PermCashIn as A GROUP BY A.PayeeID, A.Date, A.Currency, Year(A.Date) 及 我认为答案是: SELECT A.PayeeID, A.Date, A.Currency, Year(A.Date) as Yea

我在组合这两个SQL语句时遇到问题:

SELECT A.PayeeID, A.Date, Sum(A.PermCashAmt), A.Currency, Year(A.Date) as Year_Occured 
FROM PermCashIn as A 
GROUP BY A.PayeeID, A.Date, A.Currency, Year(A.Date)

我认为答案是:

SELECT A.PayeeID, A.Date, A.Currency, Year(A.Date) as Year_Occured, Sum(A.PermCashAmt), (
    SELECT SUM(C.PermCashAmt)
    FROM PermCashIn as C
    WHERE C.Date <= B.Date And Year(C.Date)=Year(B.Date) 
    And C.PayeeID = B.PayeeID
   ) as RunningTotal 
FROM PermCashIn as B 
INNER JOIN PermCashIn as A 
  ON (B.Date = A.Date) 
  AND (B.PayeeID = A.PayeeID) 
GROUP BY A.PayeeID, A.Date, A.Currency, Year(A.Date) 
ORDER BY A.PayeeID, A.Date 
但是我得到了错误

错误[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]列 “PermCashIn.Date”在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中。 错误[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]列 “PermCashIn.Date”在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中。 错误[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]列 “PermCashIn.PayeId”在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中

错误类型: System.Data.Odbc.OdbcException


我想我正确地使用了GROUPBY子句,我想知道问题是否出在我的跑步总量中。请帮助我这是我第一个使用SQL server的项目。

我认为这应该可以:

SELECT A.PayeeID, A.Date, A.Currency, Year(A.Date) as Year_Occured, Sum(A.PermCashAmt), 
Sum((
    SELECT C.PermCashAmt
    FROM PermCashIn as C
    WHERE C.Date <= B.Date And Year(C.Date)=Year(B.Date) 
    And C.PayeeID = B.PayeeID
   )) as RunningTotal 
FROM PermCashIn as B 
INNER JOIN PermCashIn as A 
  ON (B.Date = A.Date) 
  AND (B.PayeeID = A.PayeeID) 
GROUP BY A.PayeeID, A.Date, A.Currency, Year(A.Date) 
ORDER BY A.PayeeID, A.Date 

不确定是否需要双括号…

因此,我在子查询中使用了self-join,而不是对上一个select语句使用self-join。答案很明显,我不敢相信我没有看到它

SELECT A.PayeeID, A.Date, A.Currency, Year(A.Date) as Year_Occured, 
(SELECT Sum(B.PermCashAmt)
FROM PermCashIn as B 
WHERE B.Date = A.Date and B.PayeeID = A.PayeeID AND B.Currency = A.Currency) + 
ISNULL((SELECT Sum(AdjB.PermCashAmt)
FROM PermCashInAdjust as AdjB 
WHERE AdjB.Date = AdjA.Date AND AdjB.PayeeID = AdjA.PayeeID AND AdjB.Currency = AdjA.Currency),0)
as MonthTotal, 
(SELECT SUM(C.PermCashAmt)
FROM PermCashIn as C
WHERE C.Date <= A.Date And Year(C.Date)=Year(A.Date) And C.PayeeID = A.PayeeID AND C.Currency = A.Currency)  +  
ISNULL((SELECT SUM(AdjC.PermCashAmt)
FROM PermCashInAdjust as AdjC
WHERE AdjC.Date <= AdjA.Date And Year(AdjC.Date)=Year(AdjA.Date) AND AdjC.PayeeID = AdjA.PayeeID AND AdjC.Currency = AdjA.Currency),0) as RunningTotal 
从PermCashIn作为左连接permcashinad就像A.payeid=AdjA.payeid和A.Date=AdjA.Date上的AdjA一样
按A.payeid、A.Date、A.Currency、YearA.Date、AdjA.payeid、AdjA.Date、AdjA.Currency分组

您使用的sql server版本是什么。这里的查询被称为三角连接,存在一些非常严重的性能问题。如果要避免重大重写,为什么不尝试将错误消息指示的列添加到GROUPBY子句中?实际上,我敢打赌,如果您将正在运行的total子查询更改为使用A.Date和A.PayeId,而不是B中它们的等效列,那么错误可能会消失。
SELECT A.PayeeID, A.Date, A.Currency, Year(A.Date) as Year_Occured, 
(SELECT Sum(B.PermCashAmt)
FROM PermCashIn as B 
WHERE B.Date = A.Date and B.PayeeID = A.PayeeID AND B.Currency = A.Currency) + 
ISNULL((SELECT Sum(AdjB.PermCashAmt)
FROM PermCashInAdjust as AdjB 
WHERE AdjB.Date = AdjA.Date AND AdjB.PayeeID = AdjA.PayeeID AND AdjB.Currency = AdjA.Currency),0)
as MonthTotal, 
(SELECT SUM(C.PermCashAmt)
FROM PermCashIn as C
WHERE C.Date <= A.Date And Year(C.Date)=Year(A.Date) And C.PayeeID = A.PayeeID AND C.Currency = A.Currency)  +  
ISNULL((SELECT SUM(AdjC.PermCashAmt)
FROM PermCashInAdjust as AdjC
WHERE AdjC.Date <= AdjA.Date And Year(AdjC.Date)=Year(AdjA.Date) AND AdjC.PayeeID = AdjA.PayeeID AND AdjC.Currency = AdjA.Currency),0) as RunningTotal