【问题标题】:SQL Server: Split, Filter and RecombineSQL Server:拆分、筛选和重组
【发布时间】:2017-07-10 02:12:39
【问题描述】:

我想按 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.

【问题讨论】:

  • 请提供 CREATE 脚本并插入一些示例数据,我们很乐意为您提供帮助!

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


【解决方案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
)

【讨论】:

  • 是的 - 这是完美的,正是我所需要的。谢谢!
【解决方案2】:

你可以加入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;

【讨论】:

    【解决方案3】:

    选择所有存在多个不同AutoNumberLoanAgreementID

    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
    )
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多