使用联合第 2 部分从多个表中选择计数相关行

Posted

技术标签:

【中文标题】使用联合第 2 部分从多个表中选择计数相关行【英文标题】:Select count dependent rows from multiple tables with union part 2 【发布时间】:2015-12-04 01:47:01 【问题描述】:

在第 2 部分中,我有两个表

第一个表来自 tb1,第二个来自 tb2。

+------+----------+------+
| kd   | skl      | name |
+------+----------+------+
| 001  | database | a    |
| 001  | web      | b    |
| 001  | web      | c    |
| 002  | app      | d    |
| 002  | web      | e    |
| 002  | app      | f    |
| 003  | json     | g    |
| 003  | -        | h    |
| 003  | -        | i    |
| 004  | ruby     | j    |
| 004  | database | k    |
| 004  | web      | l    |
| 005  | -        | m    |
| 005  | -        | n    |
| 005  | -        | o    |
+------+----------+------+

+------+----------+------+
| kd   | skl      | name |
+------+----------+------+
| 001  | database | p    |
| 001  | web      | q    |
| 001  | web      | r    |
| 002  | app      | s    |
| 002  | web      | t    |
| 002  | app      | u    |
| 003  | json     | v    |
| 003  | web      | w    |
| 003  | app      | x    |
| 004  | ruby     | y    |
| 004  | database | z    |
| 004  | web      | d    |
| 005  | -        | c    |
| 005  | web      | b    |
| 005  | app      | a    |
+------+----------+------+

这和我在Select count dependent rows from multiple tables with union的第一个问题一样

我在下面接受这个查询。

    select kd,skl,name,sum(row) brs from
(select a.kd,skl,name,count(a.kd) row
from tb1 a where skl in('web','app')
group by a.kd,skl,name
union all
select b.kd,skl,name,count(b.kd)
from tb2 b where skl in('web','app')
group by b.kd,skl,name)t
group by kd,name,skl;

选择查询给出结果

+------+-----+------+------+
| kd   | skl | name | brs  |
+------+-----+------+------+
| 001  | web | b    |    1 |
| 001  | web | c    |    1 |
| 001  | web | q    |    1 |
| 001  | web | r    |    1 |
| 002  | app | d    |    1 |
| 002  | web | e    |    1 |
| 002  | app | f    |    1 |
| 002  | app | s    |    1 |
| 002  | web | t    |    1 |
| 002  | app | u    |    1 |
| 003  | web | w    |    1 |
| 003  | app | x    |    1 |
| 004  | web | d    |    1 |
| 004  | web | l    |    1 |
| 005  | app | a    |    1 |
| 005  | web | b    |    1 |
+------+-----+------+------+

问题是 brs 列不计数取决于 kd 列数据。

我需要下面的结果

+------+-----+------+------+
| kd   | skl | name | brs  |
+------+-----+------+------+
| 001  | web | b    |    4 |
| 001  | web | c    |    4 |
| 001  | web | q    |    4 |
| 001  | web | r    |    4 |
| 002  | app | d    |    6 |
| 002  | web | e    |    6 |
| 002  | app | f    |    6 |
| 002  | app | s    |    6 |
| 002  | web | t    |    6 |
| 002  | app | u    |    6 |
| 003  | web | w    |    2 |
| 003  | app | x    |    2 |
| 004  | web | l    |    2 |
| 004  | web | d    |    2 |
| 005  | web | b    |    2 |
| 005  | app | a    |    2 |
+------+-----+------+------+

请给出选择查询示例或该主题的线索。

非常感谢所有建议。

【问题讨论】:

您能否向我们介绍一下您的查询想要达到的目标? @TimBiegeleisen 显示所有名称列数据,计数取决于 brs 列中的 kd 列 【参考方案1】:

这不是最美观的查询,但它应该可以工作:

SELECT t1.kd, t1.sk1, t1.name, t2.brs
FROM
(
    SELECT a.kd, skl, name
    FROM tb1 a WHERE skl IN ('web','app')
    UNION ALL
    SELECT b.kd, skl, name,
    FROM tb2 b WHERE skl IN ('web','app')
) t1
INNER JOIN
(
    SELECT r.kd, SUM(r.row) brs
    FROM
    (
        SELECT a.kd, COUNT(a.kd) row
        FROM tb1 a WHERE skl IN ('web','app')
        GROUP BY a.kd
        UNION ALL
        SELECT b.kd, COUNT(b.kd)
        FROM tb2 b WHERE skl IN ('web','app')
        GROUP BY b.kd
    ) r
    GROUP BY r.kd
) t2
ON t1.kd = t2.kd

【讨论】:

以上是关于使用联合第 2 部分从多个表中选择计数相关行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

如何从表中选择所有列并计数?

从多个表中获取唯一行

HANA SQL 从一个表中找到的多个表中选择计数 (*)

mysql - 从多个表中获取相关行而不使用所有组合

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?