【问题标题】:Multiple subqueries when combined return too many results组合时的多个子查询返回太多结果
【发布时间】:2013-05-15 10:05:42
【问题描述】:

背景

我已将两个长长的金融交易列表(来自两家公司各一个)合并到一个表中(实际上是一个 DataView,原因在这里并不重要)。 这两家公司与很多客户开展业务。 我想要的是一个查询,它返回每个公司与每个客户的金融交易总数。

例如:

Customer        Company A    Company B

Customer X         10            0
Customer Y         15           26
Customer Z          0           71

因此,每位客户至少与一家公司打过交道,也可能与两家公司打过交道。

到目前为止,我的查询已经到此为止。 . .

SELECT v.[Company],
   v. [AnalysisName], 
   s1.CMTtrans,
   s2.CFLtrans
FROM vMainCustTrans AS v
LEFT JOIN (SELECT [AnalysisName], COUNT([AnalysisName]) AS CMTtrans
       FROM vMainCustTrans 
       WHERE [Company] = 'Money'
       GROUP BY [AnalysisName]) AS s1
       ON v.[AnalysisName] = s1.[AnalysisName]
LEFT JOIN (SELECT [AnalysisName], COUNT([AnalysisName]) AS CFLtrans
       FROM vMainCustTrans 
       WHERE [Company] = 'Forex'
       GROUP BY [AnalysisName]) AS s2
       ON v.[AnalysisName] = s2.[AnalysisName]
ORDER BY v.[Company], v.[AnalysisName]

现在子查询 (s1) 返回 89 个客户 子查询 (s2) 返回 37 个客户 然而整个查询返回 18,989 行 应该有 89 到 126 行(即 89 + 37)行,具体取决于 A 公司和 B 公司之间的重叠程度

有人能指出我的查询有什么问题以及我如何产生我想要的结果吗?即客户列表,其中包含他们与这两个客户中的每一个的交易次数的两个计数。

【问题讨论】:

  • 能否提供两张表的DD?我的意思是查询所需的两个表中的列?
  • 您显示的输出对结果进行了交叉制表,但查询没有。这几乎听起来像是您试图让客户和公司加入笛卡尔。在这种情况下,这是 NumberofCustomers*2。你的左连接不会实现这一点。

标签: sql


【解决方案1】:

如果我做对了 (Customer = AnalysisName),它应该如下所示:

SELECT 
   v. [AnalysisName], 
   SUM(CASE WHEN [Company] = 'Money' THEN 1 ELSE 0 END) CMTtrans,
   SUM(CASE WHEN [Company] = 'Forex' THEN 1 ELSE 0 END) CFLtrans
FROM vMainCustTrans AS v
GROUP BY v.[AnalysisName]
ORDER BY v.[AnalysisName]

【讨论】:

  • 关闭,但这会为每个客户生成两条线,而不是一条。请参阅问题中的表格示例(客户 Y)确实与公司 A 和公司 B 一起工作,但不是每家公司都有一行,我只想要一个包含两个总数的行:)
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2012-11-11
  • 2015-05-06
  • 2010-09-25
相关资源
最近更新 更多