Return SQL 服务器中的 4x4 命名列和重复行计数

Return 4x4 named columns and rows of dupe count in SQL Server

我正在尝试 return 数据库中计数结果的 4x4 网格。我计算所有记录,然后根据三个标准为四个不同的列复制记录。

例如,我试图同时输出这些不同的结果:

select count(*)
from Table1

select count(*)
from Table1
where Firm is null

select count(*)
from Table1
where Firm is not null
group by Firm having count(*) > 1

select count(*)
from Table1
where Firm is null
group by Firm having count(*) > 1

上面的相同修改需要应用到下面的代码

select count(*)
from Table2
where Office is not null
group by Office having count(*) > 1

select count(*)
from Table3
where ContactID is not null
  and record_type = 'T'
group by ContactID having count(*) > 1

select record_type, count(*)
from Table3
where ContactID is null
group by record_type

因此,虽然我可以单独执行每个查询突变并记录每个结果,但我更希望有一种方法可以一次执行所有 16 个计数。这可能吗?我试过在选择之间使用 UNION,但显然它甚至不包括对我来说毫无用处的欺骗。

如能提供正确方向的帮助,我们将不胜感激!谢谢

编辑:添加样本结果,excel格式方便。只想要 SQL 个结果:

[![期望的结果输出(excel 仅供显示)][1]][1]

由 16 个不相关的查询组成的结果集,每个查询返回一个数字

   Select 1 as rn, 'Firms' as Title, (scalar_query_1-1) as Total, (scalar_query_1-2) as Linked, (scalar_query_1-3) as NotLinked, (scalar_query_1-4) as DupeSpIds
   union all
   Select 2, 'Offices', (scalar_query_2-1) , (scalar_query_2-2) , (scalar_query_2-3), (scalar_query_1-4)
   union all
   Select 3, 'Reps total', (scalar_query_3-1) , (scalar_query_3-2) , (scalar_query_3-3), (scalar_query_3-4)
   union all
   Select 4, 'Reps individual', (scalar_query_4-1) , (scalar_query_4-2) , (scalar_query_4-3), (scalar_query_4-4)
   Order by rn

从上下文来看,您的 sql 查询似乎实际上是相互平行的。换句话说,我认为他们重复了四次相同的逻辑,只是来源不同。如果是这样,那么我的建议如下:

首先,获取四个来源并将它们堆叠成一个组合数据集。这就是我在下面代码中的 'structured' CTE 中所做的。您将只想包含相关的列,并通用化列名。我选择了名称 'source' 和 'grouping' 来指示数据的来源以及在您的逻辑中如何在概念上对其进行分组。请注意使用 union all 而不是简单地 union 来防止处理器花时间尝试输出不同的行。另外,我假设 'table3' 如何转换为您的样本输出。但是,如果我离开了,你知道你的数据,所以希望你可以适当地更正。

其次,在 'grouping' 级别进行必要的聚合。这就是我在 groupedAggs CTE 中所做的。由于需要识别组内的重复项,因此需要此中间级别。注意条件逻辑使用 case 语句,而不是多次引用同一源的整个子查询。

第三,在 'source' 级别进行最终级别聚合,以生成类似于示例输出的内容。

with structured as (

    select 'firms' as source, firm as grouping from table1 union all
    select 'offices', office from table2 union all
    select 'reps-total', contact from table3 where recordType = 't' union all
    select 'reps-individual', contact from table3 where recordType <> 't'

),

groupedAggs as (

    select      source, 
                grouping,
                total = count(*),
                linked = sum(case when grouping is not null then 1 else 0 end),
                dupes = case when count(*) > 1 then count(*) else 0 end
    from        structured
    group by    source,
                grouping

)

select      source, 
            total = sum(total),
            linked = sum(linked),
            unlinked = sum(total) - sum(linked),
            dupes = sum(dupes)
from        groupedAggs
group by    source