如何计算SQL Server上以2列作为参数的表中的值数?
我有两个表,其中值如下: 表A:如何计算SQL Server上以2列作为参数的表中的值数?,sql,sql-server,count,Sql,Sql Server,Count,我有两个表,其中值如下: 表A: | Date | Time | Count | =============================================== | D1 | T1 | 0 | | D1 | T2 | 0 | | D2 | T1 | 0
| Date | Time | Count |
===============================================
| D1 | T1 | 0 |
| D1 | T2 | 0 |
| D2 | T1 | 0 |
| D2 | T2 | 0 |
表B:
| Date | Time | Value |
===============================================
| D1 | T1 | a |
| D1 | T1 | b |
| D1 | T1 | c |
| D1 | T2 | e |
| D2 | T1 | f |
| D2 | T1 | g |
| D2 | T1 | h |
| D2 | T2 | i |
| D2 | T2 | j |
我正在尝试创建一个查询,该查询可以从表B
中计算值的数量,并将结果插入表a的列中
结果应显示在哪里(在表A上):
我尝试使用普通更新代码:
UPDATE A
SET Count = (SELECT COUNT(Value)
FROM B, A
WHERE A.Date = B.Date
and A.Time = B.Time)
但是,它导致所有计数变为9,而不是显示每个日期和时间设置的值
我无法为每个日期和时间数据创建ID,因为列Date和Time的值将每小时更改一次
我的代码是否有问题,或者是否有其他方法来解决这个问题
提前感谢您提供的任何帮助SQL的主要问题是它不区分行-它只是将所有行更新为单个计算值。您需要将要更新的表连接回源-在这种情况下,它是tableB
的分组版本
这应该可以
UPDATE tableA
SET Count = b.Count
FROM tableA a
INNER JOIN
(
SELECT Date, Time, COUNT(value) as Count
FROM tableB
GROUP BY Date,Time
) b
ON a.Date = b.Date AND a.Time=b.Time
现场演示:您可以使用加入。但是,第二个表应该将计数[Value]
作为子查询
查询
update t1
set [t1].[Count] = [t2].[Count]
from [TableA] as [t1]
join (
select [Date], [Time], count([Value]) as [Count]
from [TableB]
group by [Date], [Time]
) as [t2]
on [t1].[Date] = [t2].[Date]
and [t1].[Time] = [t2].[Time];
您正在使用的查询:
UPDATE A
SET Count = (SELECT COUNT(Value)
FROM B, A --<-- A being used here overrides `A` of `UPDATE`
WHERE A.Date = B.Date
and A.Time = B.Time)
在此查询中,根据以下条件,正在更新的行与B
中的所有行之间存在相关性:
A.Date = B.Date and A.Time = B.Time
因此,子查询返回的值取决于正在更新的每一行的Date
和Time
字段
发布的查询应该可以正常工作。这与您针对实际数据使用的查询完全相同吗?不完全相同,我正在减少未使用列的数量,因为我的实际数据非常庞大。但是,我的结构完全相同。我也试着加入Group By,但似乎什么也没有改变@Giorgosbetosit似乎我的评论是正确的。请检查我的答案。第二行的b.Count是指b.列的值还是应该是Count?@ErickVanhite此答案中的代码经过测试和演示(给出您的预期结果)。b.Count
指的是下方的别名表b
,它本身就是从您的TableB
中执行Count(Value)
的结果。啊,对了,很抱歉,由于所有别名,我花了一段时间才理解,非常感谢您,它现在起作用了
UPDATE A
SET Count = (SELECT COUNT(Value)
FROM B
WHERE A.Date = B.Date
and A.Time = B.Time)
A.Date = B.Date and A.Time = B.Time