SQL Server:拆分,过滤和重组

时间:2017-02-20 17:18:02

标签: sql sql-server filter split group-by

我想通过ContactID进行分组,并且仅重新组合具有不同计数的自动编号的组> 1.使用Pandas,我会做类似的事情:

refinance_data = refinance_data.groupby('ContactID').filter(lambda x: x.AutoNumber.nunique() > 1)

我的SQL查询......

SELECT Ge.LoanAgreementID, Ge.Amount, Ge.ContactID, Ge.TransactionDate, Lo.AutoNumber, Ge.GeneralLedgerType FROM GeneralLedger as Ge
JOIN LoanAgreements Lo ON Ge.LoanAgreementID = Lo.LoanAgreementID
GROUP BY Ge.ContactID HAVING COUNT(DISTINCT Lo.AutoNumber) >1;

产生以下错误:

Msg 8120, Level 16, State 1, Line 1
Column 'GeneralLedger.LoanAgreementID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

3 个答案:

答案 0 :(得分:1)

可能是这个? (如果我理解你的解释。)我不知道熊猫。

SELECT Ge.LoanAgreementID, Ge.Amount, Ge.ContactID, Ge.TransactionDate, Lo.AutoNumber, GeneralLedgerType GETBND
FROM GeneralLedger AS Ge
JOIN LoanAgreements Lo ON Ge.LoanAgreementID = Lo.LoanAgreementID
WHERE
    Ge.ContactID IN (
SELECT Ge1.ContactID
FROM GeneralLedger AS Ge1
JOIN LoanAgreements Lo1 ON Ge1.LoanAgreementID = Lo1.LoanAgreementID
GROUP BY Ge1.ContactID
HAVING COUNT(DISTINCT Lo1.AutoNumber) >1
)

答案 1 :(得分:1)

您可以加入contactId:

SELECT Ge.LoanAgreementID, Ge.Amount, Ge.ContactID, Ge.TransactionDate, Lo.AutoNumber, Ge.GeneralLedgerType
FROM GeneralLedger as Ge
INNER JOIN 
 (
    SELECT Ge.ContactID
    FROM GeneralLedger as Ge
    JOIN LoanAgreements Lo ON Ge.LoanAgreementID = Lo.LoanAgreementID
    GROUP BY Ge.ContactID
    HAVING COUNT(DISTINCT Lo.AutoNumber) >1
    ) t
ON Ge.ContactID = t.ContactID;

答案 2 :(得分:1)

选择AutoNumber存在多个不同LoanAgreementID的所有内容:

select 
   Ge.LoanAgreementID
 , Ge.Amount
 , Ge.ContactID
 , Ge.TransactionDate
 , Lo.AutoNumber
 , Ge.GeneralLedgerType
from GeneralLedger as Ge
  inner join LoanAgreements Lo 
    on Ge.LoanAgreementID = Lo.LoanAgreementID
where exists (
  select 1 
  from LoanAgreements as i
  where i.LoanAgreementID = Lo.LoanAgreementID
    and i.AutoNumber != Lo.AutoNumber
)