0

制御できないソースからのコードと名前を含む醜いテーブルがあります。これは次のようなものです (OriginalTable):

Code    | Name
--------------------
001-001 | Name1_a
001-002 | Name1_a
001-002 | Name1_b
001-003 | Name1_a
002-001 | Name2_a
002-001 | Name2_b
002-002 | Name2_a
003-001 | Name3
...

問題は、次の表のように、各コード (SmallCode) の最初の 3 桁に一意の名前が必要なことです。

Id  | Code  | Name
--------------------
1   | 001   | NameX
2   | 002   | NameY
3   | 003   | NameZ

名前を選択するために使用したい基準は、それが最も繰り返される名前か、各 SmallCode の最初の名前であることです。たとえば、NameX は、001 または最初のコード (どちらの場合も Name1_a) で始まるすべてのコードの中で最も繰り返される名前です。002 の NameY と 003 の NameZ も同様です。

今、私はこのクエリを使用していました:

select Substring(Code,1,3) as SmallCode, Code, Name
into #tmpCode
from OriginalTable

select SmallCode, Min(Code) as Code
into #tmpReducedCode
from #tmpCode
group by SmallCode

insert into ResultTable (Code, Name)
select a.SmallCode, a.Name
from #tmpCode a
    inner join #tmpReducedCode b
        on a.Code = b.Code

しかし、これは私の結果であり、コード 002-001 には 2 つの異なる名前 (Name2_a、Name2_b) があるため、間違っています。

1   | 001   | Name1_a
2   | 002   | Name2_a
3   | 002   | Name2_b
4   | 003   | Name3

問題は、OriginalTable を 2 つのテーブルに分割して、小さなコードごとに最も繰り返される名前または最初に表示される名前を選択するにはどうすればよいかということです。

4

3 に答える 3

2

最初のテーブルの場合:

select Substring(Code,1,3) as SmallCode, Code, Name
into #tmpCode
from OriginalTable

select SmallCode, Name
into #tmpReducedCode
from (
    select SmallCode, Name, row_number() over (partition by SmallCode order by Total desc) rn
    from (
        select SmallCode, Name, count(*) Total
        from #tmpCode
        group by SmallCode, Name) x) y
where rn=1;

select distinct a.SmallCode, b.Name
from #tmpCode a
    inner join #tmpReducedCode b
        on left(a.Code,3) = b.SmallCode
于 2012-11-29T22:24:38.717 に答える
1

これを行う最良の方法は、ウィンドウ関数を使用することだと思います。

select cast(LEFT(code, 3) as int) as id,
       RIGHT(code, 3) as code,
       name
from (select cn.*, ROW_NUMBER() over (partition by code order by cnt desc) as seqnum
      from (select code, name, COUNT(*) as cnt
            from OriginalTable ot
            group by code, name
           ) cn
     ) cn
where seqnum = 1

これは、SQL Server 2005 以降のバージョンを使用していることを前提としています。

于 2012-11-29T23:05:14.203 に答える
1

コードごとにサブクエリを実行します。

select distinct substring(Code,1,3) as "Code", 
    (select top 1 Name
    from OrginalTable tab2
    where substring(tab2.Code,1,3)=substring(tab1.Code,1,3)
    group by substring(Code,1,3), Name 
    order by count(Name) desc) as "Name"
from OrginalTable tab1;
于 2012-11-29T22:36:29.830 に答える