【问题标题】:Aggregate functions as column results from multiple tables聚合函数作为来自多个表的列结果
【发布时间】:2018-07-09 21:16:54
【问题描述】:

我有以下表结构:

Table1
--------------
Table1Id
Field1
Field2

Table2
------------
Table2Id
Table1Id
Field1
Field2

Table3
-----------
Table3Id
Table1Id
Field1
Field2

我需要能够选择Table1中的所有字段,Table2中的记录数,Table3中的记录数其中Table2中的记录数> Table3中的记录数

以下是给定数据的预期输出示例:

Table1 Data
-------------
1     Record1Field1     Record1Feild2
2     Record2Field1     Record2Feild2
3     Record3Field1     Record3Feild2
4     Record4Field1     Record4Feild2 

Table2 Data
------------
1      1     Record1Field1     Record1Feild2
2      1     Record2Field1     Record2Feild2
3      2     Record3Field1     Record3Feild2
4      2     Record4Field1     Record4Feild2
5      2     Record5Field1     Record5Feild2
6      4     Record6Field1     Record6Feild2
7      4     Record6Field1     Record6Feild2
8      4     Record6Field1     Record6Feild2

Table3 Data
------------
1      2     Record1Field1     Record1Feild2   
2      2     Record2Field1     Record2Feild2   
3      3     Record3Field1     Record3Feild2   
4      3     Record4Field1     Record4Feild2   
5      3     Record5Field1     Record5Feild2   
6      4     Record6Field1     Record6Feild2   

期望的结果

Table1Id     Field1         Field2            Table2Count     Table3Count
1            Record1Field1  Record1Field2     2               0
2            Record2Field1  Recird2Field2     3               2
4            Record4Field1  Recird4Field2     3               1

表1中的注意记录3没有显示,因为表2中的记录数小于表3中的记录数。我能够使用与下面类似的非常丑陋的查询来完成这项工作,但我觉得使用连接有更好的方法。

SELECT
    t1.Table1Id,
    t1.Field1,
    t1.Field2
    (Select Count(Table2Id) From Table2 t2 Where t2.Table1Id = t1.Table1Id) as Table2Count,
    (Select Count(Table3Id) From Table3 t3 Where t3.Table1Id = t1.Table1Id) as Table3Count,
From 
    Table1 t1
Where
    (Select Count(Table2Id) From Table2 t2 Where t2.Table1Id = t1.Table1Id)  >  (Select Count(Table3Id) From Table3 t3 Where t3.Table1Id = t1.Table1Id)

【问题讨论】:

  • 如果您可以发布表格和数据定义和/或 sqlfiddle,我们就更容易搞砸了
  • 感谢您的评论。我什至不知道 sqlfiddle。非常感谢你的帮忙。这是使用 sqlfiddle 的示例和答案的链接。 sqlfiddle.com/#!9/8cd7fe/6

标签: sql sql-server join left-join


【解决方案1】:

如果没有工作示例,很难对其进行测试,但这些方面的东西应该是一个很好的起点。

SELECT
    t1.Table1Id,
    t1.Field1,
    t1.Field2,
    COUNT(DISTINCT t2.Table2Id),
    COUNT(DISTINCT t3.Table3Id)
From Table1 t1 
    LEFT OUTER JOIN Table2 t2 ON t1.Table1Id = t2.Table1Id
    LEFT OUTER JOIN Table3 t3 ON t1.Table1Id = t3.Table1Id
GROUP BY t1.Table1Id
HAVING COUNT(DISTINCT t2.Table2Id) > COUNT(DISTINCT t3.Table3Id)

【讨论】:

  • SELECT 语句中的计数在哪里?
  • @Sami 已编辑以解决您的评论。
  • COUNT()COUNT(DISTINCT ) 不同
  • 我需要区分,因为我同时加入两个表,所以可能会有重复。例如,表 2 中有 3 条记录,表 3 中有 4 条记录,使用 group by,除非我使用 distinct,否则我会得到不正确的数字。
【解决方案2】:

您可以在 t1 和数据表 t2 e t3 中获取所有值,以通过对分组值进行连接来进行比较

SELECT
     t1.Table1Id
    ,t1.Field1
    ,t1.Field2
    , tt2.count_t2
    , tt3.count_t3
from table1 t1
join  (
  select Table1Id, count(*)  count_t2
  From Table2
  group by Table1Id
) tt2 on tt2.Table1Id  = t1.Table1Id
join  (
  select Table1Id, count(*)  count_t3
  From Table3
  group by Table1Id
) tt3 on tt3.Table1Id  = t1.Table1Id
where tt2.count_t2 < tt3.count_t3 < 

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多