2016-07-21 7 views
0

を使用して、私は次のような結果を返す次のクエリSQL Serverの - 動的ピボット既存のテーブル

SELECT CONCAT(RIGHT('00' + CONVERT(VARCHAR(2),Procedures.SeriesNum),2),'-',RIGHT('0000' + CONVERT(VARCHAR(4),Procedures.ProcNum),4)) AS 'Procedure', 
Procedures.Description, 
Procedures.CurrentRev, 
Procedures.DayToDayLevel, 
Procedures.MaxLevel, 
Users.Username, 
UsersProcedures.RevTrained, 
UsersProcedures.LevelTrained 
FROM Procedures 
CROSS JOIN Users 
LEFT JOIN UsersProcedures ON UsersProcedures.Username = Users.Username AND Procedures.SeriesNum = UsersProcedures.SeriesNum AND Procedures.ProcNum = UsersProcedures.ProcNum 

持っている:私は、各ユーザーのための情報となるようピボットを使用したいしかし Results を(具体的に彼らが訓練されたレベルは列の値として表示されます(列のタイトルはユーザー名のものです)。

私はCurrentRevを無視したいのではなく、各プロシージャの各リビジョンに対して1行現在のリビジョンに訓練されたユーザーはいません。 SERSのような以下、)空行として存在する必要があることを、任意の以前のリビジョンその手続き上、またはしないように訓練されている:

enter image description here

私は私が決してきませんが、私は、ピボットを使用する必要があると推定しますこれまでに試したことがあります。さらに、Webで見た例は、ピボット列の静的リストを使用するようですが、Usersテーブルのすべてのレコードを使用したいと考えています。

データグリッドに結果を表示する場合は、わかりやすいように色付けされています。

これを試してみるとどうなりますか?

UPDATE:私は限り、このクエリとして持って

SELECT * 
FROM (SELECT CONCAT(RIGHT('00' + CONVERT(VARCHAR(2),Procedures.SeriesNum),2),'-',RIGHT('0000' + CONVERT(VARCHAR(4),Procedures.ProcNum),4)) AS 'Procedure', 
Procedures.Description, 
Procedures.CurrentRev, 
UsersProcedures.RevTrained, 
Users.Username, 
UsersProcedures.LevelTrained FROM Procedures CROSS JOIN Users LEFT JOIN UsersProcedures ON UsersProcedures.Username = Users.Username AND Procedures.SeriesNum = UsersProcedures.SeriesNum AND Procedures.ProcNum = UsersProcedures.ProcNum) AS Procs 
    PIVOT 
    (
    MAX(LevelTrained) 
    FOR Procs.Username 
    IN(User1,User2,User3) 
) AS PivotTable 

私にこの与える:

enter image description here

私にさらに同様の

しかし、私は思います、まだグループに同様の結果を2番目のスクリーンショット。すなわち、少なくとも1人のユーザが既に特定のリビジョンについて訓練されている場合、そのリビジョンに対して別の空の行も表示しない。

また、RevTrainedがNULLの場合、その場所にCurrentRevを表示します。

+1

はい、動的ピボットが必要です。それはいくつかの作業が必要です。いくつかの洞察力については、[この質問](http://stackoverflow.com/questions/38270987/sql-server-2012-dynamic-pivot-concatenation-for-cross-tab/38271962#38271962)をご覧ください。私は少しでもあなたを助けるためにもう少し時間を見つけようとします。 – PacoDePaco

+0

ピボットデータの集計にはすべての例が含まれていますが、実際にはそうしたくないと付け加えておきます。これは、ユーザーごとに表示する単一の値(そのプロシージャのトレーニングレベルとそのリビジョン)です。 –

答えて

0

OK、ここに完成ソリューションは、すべてのユーザーを取得するには、動的クエリを使用して、だし、上記課題を解決するためにIF文:

少なくとも1人のユーザーが既に特定のリビジョンに訓練されている場合そのリビジョンにもう1つ空の行を表示しないでください。 また、RevTrainedがNULLの場合、その場所にCurrentRevを表示します。

DECLARE @users AS VARCHAR(MAX),@query AS VARCHAR(MAX) 
SELECT @users = STUFF((SELECT ',' + CONCAT('[',Username,']') FROM Users FOR XML PATH(''),TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') 
SET @query = 'SELECT * 
FROM (SELECT CONCAT(RIGHT(''00'' + CONVERT(VARCHAR(2),Procedures.SeriesNum),2),''-'',RIGHT(''0000'' + CONVERT(VARCHAR(4),Procedures.ProcNum),4)) AS ''Procedure Number'', 
CASE WHEN UsersProcedures.RevTrained IS NULL THEN Procedures.CurrentRev ELSE UsersProcedures.RevTrained END AS ''Revision'', 
Procedures.Description, 
Procedures.DayToDayLevel AS ''Maxmimum Training Level'', 
Procedures.DayToDayLevel AS ''Training level for Day to Day Usage'', 
Users.Username, 
UsersProcedures.LevelTrained FROM Procedures CROSS JOIN Users LEFT JOIN UsersProcedures ON UsersProcedures.Username = Users.Username AND Procedures.SeriesNum = UsersProcedures.SeriesNum AND Procedures.ProcNum = UsersProcedures.ProcNum) AS Procs 
PIVOT(
MAX(LevelTrained) 
FOR Procs.Username 
IN('[email protected]+')) AS PivotTable' 
execute(@query); 
関連する問題