获取不同查询值的行数

时间:2019-07-25 20:10:44

标签: sql sql-server

一个临时表具有700多个带有PK的记录。 12列包含查找表中的ID值。每个查找表中都有4-8条记录。如何获取表LookupA中每个Id值的记录计数,该值通过PK与其他所有查找表中的Id值有关系?每个查询表中的每个查询值都需要与其他所有查询表和值进行比较,以获取记录计数。

我可以编写一条SQL语句来获取特定列的特定值,但这是一个漫长的练习,并且会降低proc的速度。

这是数据样本。

PK   LookupA    LookupB    LookupC
1       1          1          3       
2       1          2          3
3       1          3          2
4       2          4          2
5       4          1          1
6       3          2          1
7       2          3          3
8       4          4          3
9       4          3          2
10      1          1          2

结果需要将LookupA与LookupB和LookupC进行比较以获得行计数。

Table    Value    LookupB 1  2  3  4     LookupC 1  2  3
LookupA    1              2  1  1  0             0  2  2
           2              0  0  1  1             0  1  1
           3              0  1  0  0             1  0  0
           4              1  0  1  1             1  1  1

然后将LookupB与LookupA和LookupC进行比较。 然后将LookupC与LookupA和LookupB进行比较。

3 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您的临时表包含其他表的外键,那么为什么不简单地使用联接呢?像这样的东西。

SELECT COUNT(DISTINCT lookupA.id) as CountA
  , COUNT(DISTINCT lookupB.id) as CountB
  , etc...
FROM #temp_table t
LEFT OUTER JOIN lookupA a on a.id = t.lookupA
LEFT OUTER JOIN lookupB b on b.id = t.lookupB
...etc

如果可能的话,我建议您对设计进行审查。有这么多的小表会使事情变得复杂,难道无法合并它而仅拥有一个查询表吗?您可以有一个附加字段“ LookupType”,所有查找都可以在同一位置,这将使检索变得更加简单。

答案 1 :(得分:0)

使用此代码,您可以成对获取A,B和C的所有组合的数字:

select 'A-B' as Combination, LookupA, LookupB, count(*) as NumRecords
from table
group by Combination,LookupA, LookupB
UNION       
select 'A-C' as Combination, LookupA, LookupC, count(*) as NumRecords
from table
group by Combination,LookupA, LookupC
UNION       
select 'B-C' as Combination, LookupB, LookupC, count(*) as NumRecords
from table
group by Combination,LookupB, LookupC

在此之后,如果您想查看LookupA与B和C的所有值, 寻找A-B和A-C组合

答案 2 :(得分:0)

我使用下面的语句的少量派生词,没有任何UNION,使我可以进入我想去的地方。

/ *  选择“ A-B”作为组合,选择LookupA,LookupB,count(*)作为NumRecords  从表  按组合,LookupA,LookupB分组 * /

我使用了变量和WHILE循环将各种摘要放置在需要的地方。

相关问题