0

親テーブルがSalTypeあり、そのテーブルSaltype_nameに列名があります。StaffSalと外部キー関係を持つ別のテーブルSalTypeStaffSalで各SalType_nameの値を入力しています

テーブル構造はこんな感じ

SalType --table1
SS_id  SalType_name
1      Basic
2      HRA
3      DA

StaffSal  --table2
SV_id  SS_id  SV_value   U_id
2       1       15000    11
3       2       0.1      11
4       3       0.75     11
5       1      10000     12
6       2       0.01     12
7       3       0.5      12

このように表示する必要があります

U_id  Basic  HRA   DA ...
11    15000  .1    .75
12    10000  .01   .5

誰か助けてもらえますか?

4

2 に答える 2

2

データを行から列に変換する方法はいくつかあります。

SQL ServerにはPIVOT、データを回転させるために適用できる機能があります。

列に変換する値の数が有限である場合は、クエリをハードコーディングできます。

select u_id, Basic, HRA, DA
from
(
  select t.saltype_name,
    s.u_id,
    s.sv_value
  from saltype t
  left join staffsal s
    on t.ss_id = s.ss_id
) src
pivot
(
  max(sv_value)
  for saltype_name in (Basic, HRA, DA)
) piv;

SQL FiddlewithDemoを参照してください。

ただし、値の数が不明な場合は、動的SQLを実装して結果を生成する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(SalType_name) 
                    from SalType
                    group by SS_id, SalType_name
                    order by SS_id 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT u_id, ' + @cols + ' 
              from 
             (
                select t.saltype_name,
                  s.u_id,
                  s.sv_value
                from saltype t
                left join staffsal s
                  on t.ss_id = s.ss_id
            ) x
            pivot 
            (
                max(sv_value)
                for saltype_name in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください。

どちらのクエリでも結果が得られます。

| U_ID | BASIC |  HRA |   DA |
------------------------------
|   11 | 15000 |  0.1 | 0.75 |
|   12 | 10000 | 0.01 |  0.5 |
于 2013-03-21T10:18:24.283 に答える
1

SQL Serverのピボットを使用して、上記の結果を得ることができます。

SELECT * FROM 
          (SELECT
               SV_value,
               SalType_name,
               U_id
           FROM 
              StaffSal
           INNER JOIN SalType 
                   ON StaffSal.SS_id= SalType.SS_id) AS SalaryDetails
PIVOT (SUM(SV_value) FOR SalType_name IN (HRA,Basic,DA)) AS PVT
于 2013-03-21T10:09:48.400 に答える