3

与えられた下のテーブルのピボット テーブル (クロス集計) を表示したいと思います。

テーブル:Employee

CREATE TABLE Employee
(
Employee_Number varchar(10),
Employee_Role varchar(50),
Group_Name varchar(10)
);

挿入:

INSERT INTO Employee VALUES('EMP101','C# Developer','Group_1'),
                           ('EMP102','ASP Developer','Group_1'),
                           ('EMP103','SQL Developer','Group_2'),
                           ('EMP104','PLSQL Developer','Group_2'),
                           ('EMP101','Java Developer',''),
                           ('EMP102','Web Developer','');

以下に示すように、上記のデータのピボット テーブルを表示します。

期待される結果:

Employee_Number     TotalRoles      TotalGroups       Available     Others     Group_1     Group_2
---------------------------------------------------------------------------------------------------
   EMP101               2                2                1           1           1           0
   EMP102               2                2                1           1           1           0
   EMP103               1                2                1           0           0           1 
   EMP104               1                2                1           0           0           1

説明: Employee_NumberTotalRoles各従業員が持っている 、TotalGroupsすべての従業員に存在する を表示したい、Availableはその従業員がいくつのグループで利用できるかOthersを示し、 はその従業員が他のグループでも利用可能であることを示す必要がありますが、これには group_name が割り当てられていません最後Group_Namesに、ピボット形式で表示する必要があります。

4

2 に答える 2

1
SELECT * FROM crosstab(
      $$SELECT grp.*, e.group_name
             , CASE WHEN e.employee_number IS NULL THEN 0 ELSE 1 END AS val
        FROM  (
           SELECT employee_number
                , count(employee_role)::int            AS total_roles
                , (SELECT count(DISTINCT group_name)::int
                   FROM   employee
                   WHERE  group_name <> '')            AS total_groups
                , count(group_name <> '' OR NULL)::int AS available
                , count(group_name =  '' OR NULL)::int AS others
           FROM   employee
           GROUP  BY 1
           ) grp
        LEFT   JOIN employee e ON e.employee_number = grp.employee_number
                              AND e.group_name <> ''
        ORDER  BY grp.employee_number, e.group_name$$
     ,$$VALUES ('Group_1'::text), ('Group_2')$$
   ) AS ct (employee_number text
          , total_roles  int
          , total_groups int
          , available    int
          , others       int
          , "Group_1"    int
          , "Group_2"    int);

sqlfiddle.com にインストールされていないクロス集計ステップではなく、基本クエリを示すSQL Fiddle

クロス集計の基本:

このクロス集計の特別な点: すべての「余分な」列。これらの列は、「行名」の後、「カテゴリ」と「値」の前の真ん中に配置されます。

繰り返しになりますが、グループの動的セットがある場合は、このステートメントを動的に構築し、2 回目の呼び出しで実行する必要があります。

于 2015-03-18T09:01:27.113 に答える