1
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

取引は、1 つのテーブルに最大数を取得する必要があることです。

@A の 3A と @B の 7B は 1 つのテーブルにある必要があります。

@C に含める必要があります

@C

A
A
A
B
B
B
B
B
B
B

@A からの A の内容と @B からの B の内容をテーブル @C に入れたかったのです。どうやって?

可能であれば、上記の例に最適な SQL クエリを教えてください。

4

3 に答える 3

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

于 2013-09-15T14:46:25.330 に答える
1

実際に作業する必要がある実際のデータセットに列が 1 つしかない場合、@Laurence の提案で十分であると思います。

ただし、返される必要がある他の列があり、それらの列に示されているものと同じデータがない場合は、次のアプローチを試すことができます。

  1. name各テーブルのパーティションごとに行をカウントします。

  2. 2 つのセットを結合 ( )し、結合された行セットのパーティションUNION ALLごとの最大カウント値を取得します。name

  3. カウント値が最大値と一致する行を取得します。

上記の実装の 1 つを次に示します。

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
;

こちらの SQL Fiddle デモもご覧ください。

于 2013-09-20T05:06:40.160 に答える
0

何を手に入れたいかは言えません。1 つのテーブルで 3 と 7 を取得する場合は、ローレンスの回答を使用します。問題のテーブルを出力として使用する場合は、次を使用します。

;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

于 2013-09-15T16:42:22.813 に答える