从另一个表中逐行计数,在sql中的两个表上保存一些条件
Posted
技术标签:
【中文标题】从另一个表中逐行计数,在sql中的两个表上保存一些条件【英文标题】:count of row by row from another table holding some conditions on both tables in sql 【发布时间】:2020-08-25 12:26:36 【问题描述】:有两个表Table1和Table2
A B C S
a 1 21 Summer
b 2 22 Summer
c 3 34 Summer
D E F S
a 1 21 Summer
d 5 22 Summer
f 2 34 Summer
我想根据表第一列的 B 列小于表第二列 E 的值等条件,从表第二列中获取表第一列的所有列和列 F 的计数。
我试过这个查询
select a.*,
(select count(F) from Table2 JOIN Table1 on table1.S=table2.S where table1.B<table2.E ) AS Cnt
from Table1 a
但是,对于所有不正确的行,它给了我相同的计数 我需要根据满足的条件进行计数。
【问题讨论】:
不等式谓词中不允许有相关列 这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。 【参考方案1】:这会起作用
DECLARE @T1 TABLE (A Varchar(10), B INT, C INT, S Varchar(10))
DECLARE @T2 TABLE (D Varchar(10), E INT, F INT, S Varchar(10))
INSERT INTO @T1 VALUES
('a', 1, 21,'Summer'),
('b', 2 ,22,'Summer'),
('c', 3, 34,'Summer')
INSERT INTO @T2 VALUES
('a', 1, 21,'Summer'),
('d', 5 ,22,'Summer'),
('f', 2 ,34,'Summer')
SELECT
T1.A,T1.B,T1.C,T1.S,
COUNT(T2.S) as Counts
FROM @T1 T1
left JOIN @T2 T2
ON T1.S = T2.S AND T1.B < T2.E
GROUP BY T1.A,T1.B,T1.C,T1.S
输出
A B C S Counts
a 1 21 Summer 2
b 2 22 Summer 1
c 3 34 Summer 1
【讨论】:
【参考方案2】: select *,
(select count(F)
from T2
where T1.S = T2.S AND T1.B < T2.E
) as Cnt from T1
【讨论】:
不等式谓词中不允许有相关列【参考方案3】:我认为你只需要一个相关的子查询:
select a.*,
(select count(t2.F)
from Table2 t2
where a.S = t2.S and t1.B < t2.E
) as Cnt
from Table1 a
【讨论】:
相关子查询不起作用你知道其他解决方案吗 还有其他解决方案吗?以上是关于从另一个表中逐行计数,在sql中的两个表上保存一些条件的主要内容,如果未能解决你的问题,请参考以下文章