2

と列を持つstaffスタッフメンバーを含むデータベーステーブルがuser_noありuser_nameます。departmentスタッフがメンバーになることができる部門を含む別のテーブルがdept_noありdept_name、列として と があります。

スタッフは複数の部門のメンバーになる可能性があるため、列と列をstaff_dept持つ 3 番目のテーブルがあり、これらは他の 2 つのテーブルの主キーです。このテーブルは、スタッフの各メンバーが所属する部門を示し、各ユーザー/部門の共通部分に対して 1 つの行が含まれています。user_nodept_no

部門ごとに 1 つの列と各部門に 1 つの行を含む、スプレッドシート (CSV ファイルなど) の形式で出力したいと考えています。Xで定義されているように、各交点に が表示されますstaff_dept

この結果を達成する単一の SQL クエリを作成できますか? forまたは、このデータを収集してフォーマットするために、「実際の」プログラミングを行う必要がありますか (明らかに、3 つまたは 4 つのループをネストするまでは「実際の」プログラムではないため)。

4

2 に答える 2

5

これは PIVOT テーブル (SQL Server を使用) で行うことができます。

SELECT user_name, [dept1name], [dept2name], [dept3name], ...
FROM
    (SELECT s.user_name, d.dept_name,
     case when sd.user_no is not null then 'X' else '' end as matches
     from staff s
     cross join department d
     left join staff_dept sd on s.user_no = sd.user_no and d.dept_no = sd.dept_no
    ) AS s
PIVOT
(
    min(matches)
    FOR dept_name IN ([dept1name], [dept2name], [dept3name], ...)
) AS pvt
order by user_name

デモ: http://www.sqlfiddle.com/#!3/c136d/5

編集: テーブル内の部門のリストから PIVOT クエリを動的に生成するには、動的 SQL を使用します。つまり、コードを変数に生成し、sp_executesqlヘルパー ストアド プロシージャを使用します。例を次に示します: http://www.sqlfiddle.com/#!3/c136d/14

于 2012-04-26T13:59:19.280 に答える
1

SQL Server (SQL Server を使用している場合) では、完全な外部結合 (関係に関係するものだけでなく、すべてのスタッフと部門を含めるため) から開始し、それをピボット ステートメントにドロップして、すべての部門を列にピボットします。を作成し、その SELECT ステートメントを生成して動的に実行する短いスクリプトを作成します (ピボット ステートメントによって作成された列はハードコーディングする必要があるため、実行時に動的に生成することはできません)。

これはサンプルです。これは unpivot ステートメントですが、概念はほとんど同じです。

于 2012-04-26T14:01:08.867 に答える