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应该包含
A
A
A
B
B
B
B
B
B
B
我想把@A和A的A的内容从@B放到@C表中。 如何?
如果可能的话,给我一个针对上面例子的最佳sql查询。
答案 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应该足够了。
但是,如果他们还有其他列需要返回,并且这些列没有您向我们展示的那些数据,那么您可以尝试这种方法:
计算每个表中每个name
分区的行数。
合并(UNION ALL
)两个集合,并获得合并行集合中每个name
分区的最大计数值。
获取计数值与最大值匹配的行。
以上是上述的一个实现:
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 强>