3

Web サイトで php を使用して SQL Server 2008 r2 を使用しています。私は2つのテーブルを持っています。

1 は従業員用です。

(int)      (nvarchar)   (nvarchar)

id         name        type
 1         john         2
 2         peter        1
 3         leah         2
 4         frank        1
 5         tang         3

2は仕事用です

(int)      (nvarchar)   (nvarchar)

workid      name        employees
  1         task1       1,3
  2         task2       2,3
  3         task3       1,3,4
  4         task4         2

タイプが 3 未満の従業員名で仕事の説明を表示するクエリを作成したいと考えています。

このような結果を得たいということです。

workid       name       employee
  1          task1      john, leah
  2          task2      peter, leah
  3          task3      john,leah,frank

同じく

どうすればSQLクエリでこの結果を達成できますか?

テーブルスキーマで変更できません。

case when ステートメントで使用しようとしましたが、機能しません。

これを機能させるために私を助けてください..

4

2 に答える 2

3

この内容は質問に完全に答えるものではありませんが、問題を単純化するためにテーブルを適切に正規化する方法を提案します。

これはMany-to-Many関係です。

Employees
- ID (Primary Key)
- Name
- Type

Task
- ID (Primary Key)
- Name

Work
- EmployeeID (Foreign Key)
- TaskID (Foreign Key)

従業員表

id         name        type
 1         john         2
 2         peter        1
 3         leah         2
 4         frank        1
 5         tang         3

タスクテーブル

 id         name        
  1         task1       
  2         task2       
  3         task3       
  4         task4  

仕事台

TaskID  EmployeeID
1           1
1           3
2           2
2           4
3           1
3           2
3           3
4           4

クエリ、

SELECT  t.ID, t.Name,
        STUFF(
        (SELECT ',' + b.Name
        FROM    Work a
                INNER JOIN Employee b
                    ON a.EmployeeID = b.ID
        WHERE   a.TaskID = t.ID 
        FOR XML PATH (''))
        , 1, 1, '')  AS NamesList
FROM    Task t
-- WHERE    ..... -- add additional conditions...
GROUP   BY t.ID, t.Name
于 2013-03-04T03:19:03.830 に答える
0

を使用してカンマ区切りのリストを分割する方法の 1 つを次に示しますFor XML

SELECT w.workid, w.name, 
  STUFF((
   SELECT ',' +  E.Name AS [text()]
    FROM  (
      SELECT A.workid,  
      Split.a.value('.', 'VARCHAR(100)') AS EmpId
      FROM  
      (SELECT workid,  
       CAST ('<M>' + REPLACE(employees, ',', '</M><M>') + '</M>' AS XML) AS String  
       FROM  work
      ) AS A 
      CROSS APPLY String.nodes ('/M') AS Split(a)
    ) A 
    JOIN employees E ON A.EmpId = E.Id
    WHERE WorkId = w.WorkId
    FOR XML PATH('')
  ), 1, 1, '') AS Employees
FROM work w

SQL フィドルのデモ

これにより、次の結果が得られます。

WORKID   NAME    EMPLOYEES
1        task1   john,leah
2        task2   peter,leah
3        task3   john,leah,frank
4        task4   peter
于 2013-03-04T03:36:02.680 に答える