【问题标题】:Error when using WHERE in Correlated Subquery在相关子查询中使用 WHERE 时出错
【发布时间】:2015-03-05 18:09:23
【问题描述】:

我有以下关系:银行 -> 融资 -> 合同 -> 供应商

我必须使用以下查询选择与供应商相关的所有银行:

SELECT DISTINCT A.Name AS BankName, A2.Name as SupplierName
FROM Companies A
INNER JOIN Financing F ON F.IdFinancialCompany = A.Id
INNER JOIN Contracts C ON F.IdContract = C.Id
INNER JOIN Companies A2 ON C.IdSupplier = A2.Id
GROUP BY A.Name, A2.Name

到目前为止,一切都很好。

现在我必须列出有效的合同数量和总合同数量,所以我考虑包含一个子查询:

SELECT DISTINCT A.Name AS BankName, A2.Name as SupplierName,
(SELECT COUNT(C.Id)),
(SELECT COUNT(C.Id) WHERE C.ContractStatus = 1)
FROM Companies A
INNER JOIN Financing F ON F.IdFinancialCompany = A.Id
INNER JOIN Contracts C ON F.IdContract = C.Id
INNER JOIN Companies A2 ON C.IdSupplier = A2.Id 
GROUP BY A.Name, A2.Name

第 2 行运行良好,但在第 3 行出现错误:

选择列表中的“Contracts.ContractStatus”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我希望得到以下结果:


银行名称 |供应商名称 |总合同 |有效合同

银行 1 |供应商 1| 5 | 2

我怎样才能做到这一点?我正在使用 SQL Server 2014

提前致谢!

【问题讨论】:

  • SUM(case C.ContractStatus when 1 then 1 end)

标签: sql-server subquery where-clause correlated-subquery


【解决方案1】:

从你的 group by 中删除 distinct 并使用 CASE

SELECT A.Name AS BankName, A2.Name as SupplierName,
COUNT(C.Id),
SUM(CASE WHEN C.ContractStatus = 1 THEN 1 ELSE 0 END) 
FROM Companies A
INNER JOIN Financing F ON F.IdFinancialCompany = A.Id
INNER JOIN Contracts C ON F.IdContract = C.Id
INNER JOIN Companies A2 ON C.IdSupplier = A2.Id 
GROUP BY A.Name, A2.Name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多