使用正常行计算输出中的值

时间:2014-03-13 06:44:43

标签: sql sql-server

我有两个名为TEST和STEPS的表,它们与Test-Id列相关。

我可以通过以下方式进行连接来获取所有必需的列。

select t.id,t.name,s.step_no,s.step_data
from test t,steps s
where t.id = s.testid

我需要的是,除了列之外,我还需要每场比赛的总行数。

小提琴:http://sqlfiddle.com/#!6/794508/1

当前输出:

ID  NAME  STEP_NO  STEP_DATA
--  ----  -------  ---------
1   TC1   1        Step 1
1   TC1   2        Step 2
1   TC1   3        Step 3
2   TC2   1        Step 1

必填项:

ID  NAME  STEP_NO  STEP_DATA  COUNT
--  ----  -------  ---------  -----
1   TC1   1        Step 1     3
1   TC1   2        Step 2     3
1   TC1   3        Step 3     3
2   TC2   1        Step 1     1

其中count是TEST表中每个Id的STEPS表中的总行数。

如果您需要任何信息,请与我们联系。

3 个答案:

答案 0 :(得分:2)

您只需在查询中添加count(*) over ...

SELECT
  t.id,
  t.name,
  s.step_no,
  s.step_data,
  [count] = COUNT(*) OVER (PARTITION BY s.testid)
FROM
  test t,
  steps s
WHERE
  t.id = s.testid

您可以在此处阅读有关OVER子句的更多信息:

请考虑养成

的习惯

因此,考虑到所有这些要点,我们可以像这样重写上述查询:

SELECT
  t.id,
  t.name,
  s.step_no,
  s.step_data,
  [count] = COUNT(*) OVER (PARTITION BY s.testid)
FROM
  dbo.test AS t
INNER JOIN
  dbo.steps AS s
ON
  t.id = s.testid
;

答案 1 :(得分:1)

select t.id,t.name,s.step_no,s.step_data,counts.count
from test t 
     join steps s ON t.id = s.testid
     join (select testid, count(*) as count 
           from steps 
           group by testid) counts ON t.id = counts.testid

答案 2 :(得分:0)

这是否有效......

DECLARE @test TABLE  
    (
     id int identity primary key, 
     name varchar(20) 
    );

INSERT INTO @test VALUES('TC1'), ('TC2');

DECLARE  @steps TABLE  
    (
     id int identity primary key, 
     testid int,
     step_no int,
     step_data varchar(100)
    );

INSERT INTO @steps(testid,step_no,step_data) VALUES
(1,1,'Step 1'), (1,2,'Step 2'),(1,3,'Step 3'),(2,1,'Step 1');

select t.id,t.name,s.step_no,s.step_data,(select SUM(testid) from @steps  where testid = s.testid)
from @test t,@steps s
where t.id = s.testid