1

私は2つの臨時雇用者を持っています。このようなテーブル

@t1(p_ssn,p_fname,p_lname,Gender,.............) ->このテーブルには従業員レコードがあり、約30列あります

@t2(p_ssn,benefit,medical_premium,dental_premium,..............)->このテーブルには従業員の福利厚生があり、約60列あります

のすべてのレコードに@t1は、1つ以上の対応するレコードがあります。@t2

テーブル間を結合して、次のような表示を取得するにはどうすればよいですか(p_ssnに結合)各従業員レコードに続いて、すべての福利厚生レコードが必要です-それぞれが示されているように異なる行にあります

p_fname,p_lname,Gender etc...      -> 1st employee
benefit1,medical_premium1,dental_premium_1     -> all the benefit records for this employee
p_fname,p_lname,Gender etc...      -> 2nd  employee
benefit1,medical_premium1,dental_premium_1 

現在、ループを使用しています。ただし、各レコードのサイズが大きいため、途中でハングアップするだけです。


@Tim-これは私が立ち往生しているところです。@ t1には30列しかありませんが、@t2には60列あります

-実際のクエリ

    select col1, col2 from 
(     -- Get employees     
 select 10 as ordinal, p_ssn, p_fname as col1, p_lname as col2,**there are only 30 columns here**     
 from @t1     
union all    
 -- Get benefits     
select 20 as ordinal, a.p_ssn, cast(b.benefit as varchar(50)), cast(b.premium as varchar(50)) ,**I want to display more columns here like b.col1,b.col2,b.col3 etc...60 columns**    
from @t1 a         
 join @t2 b on a.p_ssn = b.p_ssn ) as a order by p_ssn, ordinal 

私は次のことができることを知っています

  select 10 as ordinal, p_ssn, p_fname as col1, p_lname as col2,'','',''
from @t1
 union all
select 20 as ordinal, a.p_ssn, cast(b.benefit as varchar(50)), cast(b.premium as varchar(50)),b.col1,b.col2,n.col3

ただし、これはファイルフィードであり、空白は許可されていません。実際、長さとデータ型が定義されており、変更できないため、キャストを使用できません。

4

2 に答える 2

0

あなたはこのようなことをすることになるかもしれません:

-- Setup demo data
declare @t1 table (
      p_ssn char(11) not null primary key
    , p_fname varchar(50) not null
    , p_lname varchar(50) not null
)
insert into @t1 select '000-00-0000', 'Joe', 'Blow'
insert into @t1 select '111-11-1111', 'Jane', 'Doe'
declare @t2 table (
      p_ssn char(11) not null
    , benefit varchar(50)
    , premium int
)
insert into @t2 select '000-00-0000', 'Benefit 1', 100
insert into @t2 select '000-00-0000', 'Benefit 2', 200
insert into @t2 select '111-11-1111', 'Benefit 1', 300
insert into @t2 select '111-11-1111', 'Benefit 2', 400

-- Actual query
select col1, col2
from (
    -- Get employees
    select 10 as ordinal, p_ssn, p_fname as col1, p_lname as col2
    from @t1
    union all
    -- Get benefits
    select 20 as ordinal, a.p_ssn, cast(b.benefit as varchar(50)), cast(b.premium as varchar(50))
    from @t1 a
        join @t2 b on a.p_ssn = b.p_ssn
) as a
order by p_ssn, ordinal

このような出力を取得するには:

col1        col2
Joe         Blow
Benefit 1   100
Benefit 2   200
Jane        Doe
Benefit 1   300
Benefit 2   400

秘訣はordinal、後で並べ替えることができるその列を生成することです。

通常、データベースエンジンでこのようなレポートを作成しないことをお勧めします。ただし、これがWeb /アプリサーバーのレポートツールとフロントエンドコードの目的であるためです(これらは多くの場合、より適切にスケーリングされます)。また、 SSNを主キーとして使用する場合は注意が必要です。

于 2012-08-28T16:36:12.873 に答える
0

私の仮定では、出力は連結されたフィールド (例: p_lname + ', ' + p_fname) です。これは可能な解決策かもしれません:

declare @tmpResult table(GroupRankNo int
                        , Name nvarchar(100)
                        , Benefits nvarchar(500)
                        , SSN int)

insert into @tmpResult table(GroupRankNo
                            , Name
                            , Benefits
                            , SSN)
select row_number() over(partition by aa.Name order by aa.Name) as GroupRankNo
        , aa.Name
        , aa.Benefits
        , aa.p_ssn
from
(       
    select a.p_fname + ', ' + a.p_lname as Name
            , b.benefit + ', ' + b.premium as Benefits
            , a.p_ssn
    from @t1 a
    inner join @t2 b on b.p_ssn = a.p_ssn
) aa                                


select aa.ColumnData
from
(
    select SSN
            , Name as ColumnData
            , 0 as RowType --Header
    from @tmpResult
    where GroupRankNo = 1

    union

    select SSN
            , Benefits as ColumnData
            , 1 as RowType --Detail
    from @tmpResult
) aa
order by aa.SSN
            , RowType asc

私はそれをテストしていません。しかし、「row_number() over partition by」を使用すると、アイデアが得られます

于 2012-08-30T01:05:06.490 に答える