0

件名: 問題とそのタスク。環境: SQL Server 2008 以降 データベース テーブル: Issues、Tasks、および IssuesTasks

1 つの問題とそれに関連するタスクを処理する 1 つの入力画面があるとします。

問題 1 を扱っており、チェックするタスクが 7 つリストされています。

ユーザーは、7 つのタスクのうち 3 つを完了としてチェックし、データベースに保存します。

同じ行に7つのタスクがあるIssue1を示すSQLを書くことは可能ですか? (チェックされたのは 3 つだけなので、残りは null にする必要があることに注意してください)。

また、ユーザーがチェックした内容を表す IssuesTasks 結合テーブルには 3 つのタスクしかないことにも注意してください。

4

3 に答える 3

0

テーブルのスキーマを提供していませんが、正確なクエリを書くのは簡単ではありませんが、これを見てください

select
    I.Id,
    I.Name,
    max(case when IT.TaskId = 1 then T.Name end) as Task1,
    max(case when IT.TaskId = 2 then T.Name end) as Task2,
    max(case when IT.TaskId = 3 then T.Name end) as Task3,
    max(case when IT.TaskId = 4 then T.Name end) as Task4,
    max(case when IT.TaskId = 5 then T.Name end) as Task5,
    max(case when IT.TaskId = 6 then T.Name end) as Task6,
    max(case when IT.TaskId = 7 then T.Name end) as Task7
from Issues as I
    left outer join IssuesTasks as IT on IT.IssueId = I.Id
    left outer join Tasks as T on T.Id = IT.TaskID
group by I.Id, I.Name;

SQL FIDDLE の例を参照してください

于 2013-08-03T21:13:05.293 に答える
0

PIVOT関数で SQL サーバー ビルドを使用します。

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
    AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;

PIVOT および UNPIVOT 関係演算子を使用して、テーブル値式を別のテーブルに変更できます。PIVOT は、式の 1 つの列の一意の値を出力の複数の列に変換することで、テーブル値式をローテーションし、最終出力で必要な残りの列値に対して必要な場所で集計を実行します。UNPIVOT は、テーブル値式の列を列値に回転することにより、PIVOT とは逆の操作を実行します。

簡単な AdventureWorks の例:

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;

より複雑な例:

USE AdventureWorks2008R2;
GO
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5
FROM 
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [250], [251], [256], [257], [260] )
) AS pvt
ORDER BY pvt.VendorID;

詳細については、こちらをご覧ください

于 2013-08-03T17:06:02.803 に答える