用于将两个表的最高计数器放在一个表中的SQL查询

时间:2013-09-15 14:42:29

标签: sql sql-server tsql

declare @A table (
name varchar(10)
)



declare @B table (
name varchar(10)
)


insert into @A(name) values('A')
insert into @A(name) values('A')
insert into @A(name) values('A')
insert into @A(name) values('B')
insert into @A(name) values('B')
insert into @A(name) values('B')
insert into @A(name) values('B')



insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('B')
insert into @B(name) values('A')
insert into @B(name) values('A')

@A有3A和4B的

@B有2A和7B的

你可以这么说

           @A      @B
A         3          2

B          4          7

交易是我们必须在一个表中获得最高数字。

像@A的3A和@B的7B应该在一个表中。

@C应该包含

@C

A
A
A
B
B
B
B
B
B
B

我想把@A和A的A的内容从@B放到@C表中。 如何?

如果可能的话,给我一个针对上面例子的最佳sql查询。

3 个答案:

答案 0 :(得分:4)

新答案,现在要求已经澄清:

;With x as (
    Select
      name,
      row_number() over (partition by name order by name) rn
    From
      @A
    Union
    Select
      name,
      row_number() over (partition by name order by name)
    From 
      @B
) 
Insert Into
    @C
Select
    name
From
    x

<强> Example Fiddle

上一个回答:

Select
    name,
    max(c)
From (
    Select
        name,
        count(*) c
    From
        @A
    Group By
        name
    union all
    Select
        name,
        count(*)
    From
        @B
    Group By
        name
    ) x
Group By
    name

<强> Example Fiddle

答案 1 :(得分:1)

如果您需要使用的实际数据集确实只有一列,我相信@Laurence's suggestion应该足够了。

但是,如果他们还有其他列需要返回,并且这些列没有您向我们展示的那些数据,那么您可以尝试这种方法:

  1. 计算每个表中每个name分区的行数。

  2. 合并(UNION ALL)两个集合,并获得合并行集合中每个name分区的最大计数值。

  3. 获取计数值与最大值匹配的行。

  4. 以上是上述的一个实现:

    WITH counted AS (
      SELECT *, cnt = COUNT(*) OVER (PARTITION BY name)
      FROM A
      UNION ALL
      SELECT *, cnt = COUNT(*) OVER (PARTITION BY name)
      FROM B
    ),
    compared AS (
      SELECT *, maxcnt = MAX(cnt) OVER (PARTITION BY name)
      FROM counted
    )
    SELECT name, data
    FROM compared
    WHERE cnt = maxcnt
    ;
    

    您也可以查看this SQL Fiddle demo

答案 2 :(得分:0)

不能说你想得到什么。如果你想在一张桌子上得到3分和7分 - 那么请选择Laurence的答案,如果你想要提供的表作为输出,请使用:

;with cte(name, A, B) as (
    select name, name, cast(null as varchar(10)) from @A
    union all
    select name, cast(null as varchar(10)), name from @B
)
select
    name,
    count(A) as [@A],
    count(B) as [@B]
from cte
group by name

<强> sql fiddle demo