1

次のようなテーブルがあります。

EMPNUM  EMPNAME     LOCATION    CATEGORY    COUNT
123     JOHN DOE    BLDG A      1           5
123     JOHN DOE    BLDG A      1           6
123     JOHN DOE    BLDG A      2           4
123     JOHN DOE    BLDG A      3           7
123     JOHN DOE    BLDG B      1           1
123     JOHN DOE    BLDG B      2           3
234     EMILY DOE   BLDG A      1           1
234     EMILY DOE   BLDG A      2           2
234     EMILY DOE   BLDG A      3           4
234     EMILY DOE   BLDG B      2           3
234     EMILY DOE   BLDG B      2           9
234     EMILY DOE   BLDG B      3           3

以下のような出力が得られる列に転送したいと思います。LOCATIONとCATEGORYの値に基づいてCOUNTの合計を取得する必要があります

EMPNUM  EMPNAME     SUM_A1  SUM_A2  SUM_A3  SUM_B1  SUM_B2  SUM_B3  
123     JOHN DOE    11      4       7       1       3       0
234     EMILY DOE   1       2       4       0       12      3   

これをSQLクエリとして実行する方法はありますか?またはCrystalレポート(SQLを使用した出力が好きですが)

4

3 に答える 3

3

これは、LOCATION と CATEGORY の値が一定であれば機能します。

select empnum
       , empname
       , sum(case when location='BLDG A' and category = 1 then count else 0 end) sum_a1 
       , sum(case when location='BLDG A' and category = 2 then count else 0 end) sum_a2
       , sum(case when location='BLDG A' and category = 3 then count else 0 end) sum_a3
       , sum(case when location='BLDG B' and category = 1 then count else 0 end) sum_b1
       , sum(case when location='BLDG B' and category = 2 then count else 0 end) sum_b2
       , sum(case when location='BLDG B' and category = 3 then count else 0 end) sum_b3
from your_table
group by empnum
       , empname

クエリの実行時に値が不明または安定していない場合は、動的 SQL を使用する必要があります。


11g を使用している場合は、より洗練されたAB Cade の PIVOT ソリューションを使用する必要があることに注意してください。

于 2012-10-26T07:45:23.027 に答える
3

11g以降を使用している場合は試してください

select * from table1
PIVOT  (SUM("COUNT")         
        FOR ("LOCATION","CATEGORY") IN 
        (('BLDG A',1) AS sum_a1,
         ('BLDG A',2) AS sum_a2,
         ('BLDG A',3) AS sum_a3,
        ('BLDG B',1) AS sum_b1,
        ('BLDG B',2) AS sum_b2,
        ('BLDG B',3) AS sum_b3));

ここにフィドルがあります

それ以外の場合は、 APC のソリューションを使用してください

于 2012-10-26T07:47:01.767 に答える
0

列に変換する既知の数の値がある場合、他の答えはうまく機能します。ただし、番号が不明な場合は、動的 SQL を使用して結果を生成できます。

次のプロシージャを作成します。

CREATE OR REPLACE procedure test_dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select empnum, empname';

    begin
        for x in (select distinct location, category from yourtable order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when location = '''||x.location||''' and category='||x.category||' then cnt else 0 end) as sum_'||substr(x.location, -1, 1)||x.category;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from yourtable group by empnum, empname';

        open p_cursor for sql_query;
    end;
/

そして、それを実行するには:

variable x refcursor
exec test_dynamic_pivot(:x)
print x

結果は、ハードコードされたバージョンと同じです。

| EMPNUM |   EMPNAME | SUM_A1 | SUM_A2 | SUM_A3 | SUM_B1 | SUM_B2 | SUM_B3 |
----------------------------------------------------------------------------
|    234 | EMILY DOE |      1 |      2 |      4 |      0 |     12 |      3 |
|    123 |  JOHN DOE |     11 |      4 |      7 |      1 |      3 |      0 |
于 2012-10-26T10:50:07.900 に答える