2017-10-13 13 views
0

スクリプトは結果を示しています(スクリーンショット01を参照)Screenshot 01 結果は(スクリーンショット02を参照)Screenshot02として表示する必要があります。行をTSQLの列に転記する方法は?

work_date(スクリーンショット01を参照)の日付は、個々の日付として表示する必要があります。work_hour(スクリーンショット01を参照)の列と時間は、個々の日付列の下に表示する必要があります。

DECLARE @01_STARTDATE VARCHAR(100); 
DECLARE @02_ENDDATE VARCHAR(100); 
DECLARE @STAFF INT; 

SET @01_STARTDATE = '2017-07-06'; 
SET @02_ENDDATE = '2017-07-10'; 
SET @STAFF = 8; 

SELECT 
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range], 
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff, 
    f.FACILITY_NAME AS Site_Name, 
    P.PRJ_PROJECT_NAME AS Project_Name, 
    R.PROJECT_TYPE_NAME AS Project_Type_Brownfield, 
    '' AS Project_Type_VRP, 
    st.work_hour, st.work_date 
FROM 
    FAC_FACILITY AS f 
INNER JOIN 
    GOV.PRJ_PROJECT AS P ON f.FACILITY_RID = p.FACILITY_RID 
INNER JOIN 
    GOV.SYS_TIME_LOG AS ST ON ST.PRJ_PROJECT_RID = P.PRJ_PROJECT_RID 
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID 
LEFT JOIN 
    GOV.REF_PROJECT_TYPE AS R ON P.PROJECT_TYPE_RID = R.PROJECT_TYPE_RID 
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE) 
    AND ST.USER_RID = @STAFF   
    AND R.PROJECT_TYPE_RID = 3 
GROUP BY 
    f.FACILITY_NAME, P.PRJ_PROJECT_NAME, SU.FIRST_NAME, 
    st.work_date, SU.LAST_NAME, R.PROJECT_TYPE_NAME, 
    st.work_hour 

UNION ALL 

SELECT 
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range], 
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff, 
    f.FACILITY_NAME AS Site_Name, 
    P.PRJ_PROJECT_NAME AS Project_Name, 
    '' AS Project_Type_Brownfield, 
    R.PROJECT_TYPE_NAME AS Project_Type_VRP, 
    st.work_hour, st.work_date 
FROM 
    FAC_FACILITY AS f 
INNER JOIN 
    GOV.PRJ_PROJECT AS P ON f.FACILITY_RID = p.FACILITY_RID 
INNER JOIN 
    GOV.SYS_TIME_LOG AS ST ON ST.PRJ_PROJECT_RID = P.PRJ_PROJECT_RID 
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID 
LEFT JOIN 
    GOV.REF_PROJECT_TYPE AS R ON P.PROJECT_TYPE_RID = R.PROJECT_TYPE_RID 
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE) 
    AND ST.USER_RID = @STAFF   
    AND R.PROJECT_TYPE_RID = 2 
GROUP BY 
    f.FACILITY_NAME, P.PRJ_PROJECT_NAME, SU.FIRST_NAME, 
    st.work_date, SU.LAST_NAME, R.PROJECT_TYPE_NAME, 
    st.work_hour 

UNION ALL 

SELECT 
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range], 
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff, 
    g.grant_name AS Site_Name, 
    '' AS project_name, 
    '' AS Project_Type_Brownfield, 
    '' AS Project_Type_VRP, 
    st.work_hour, st.work_date 
FROM 
    (SELECT 
     SUM(work_hour) AS work_hour, user_rid, 
     grant_rid, work_date 
    FROM 
     GOV.SYS_TIME_LOG 
    WHERE 
     WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE) 
     AND USER_RID = @STAFF   
     AND grant_rid = 1 
    GROUP BY 
     grant_rid, user_rid, work_date) AS ST 
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID 
LEFT JOIN 
    SYS_GRANT AS G ON st.grant_rid = g.grant_rid 
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE) 
    AND ST.USER_RID = @STAFF   
    AND st.grant_rid = 1 
GROUP BY 
    SU.FIRST_NAME, st.work_date, SU.LAST_NAME, 
    G.Grant_name, st.work_hour; 
+1

[日付を含む複数の列を持つSQL Serverピボットテーブル](https://stackoverflow.com/questions/31300884/sql-server-pivot-table-with-multiple-column-with-dates)の可能な複製 – JNevill

+0

If PIVOTをサポートしているRDBMSを使用していて、そのコマンドに関するベンダーのドキュメントを調べています。 TSQLにタグを付けたので、第三者のレポートツールを調べることをお勧めします。この種のロールアップは、標準のSQLにはうまく対応せず、不器用でエラーを起こしやすくなります。 –

+0

日付変数はなぜvarcharですか?列のデータ型は何ですか?動的PIVOTまたは動的クロスタブは、ここで必要なものです。ここでUNION ALLを使用している理由はわかりません。あなたは単一のクエリでそれを行うことができます。 –

答えて

0

このような第二のように見えるためにあなたの最初のイメージとして、どのように「ピボット」出力の可能な多数の例があります。さらに、パラメータを使用して日付範囲を変更する場合は、「動的SQL」を使用して、「動的列名」を生成する必要があります。

3つの個別のクエリを実行して必要な情報を収集する必要はありませんが、クエリの最後の瞬間まで待って値の出力を抑止する必要があります。理想的には、これをSQLを使用して行うのではなく、「プレゼンテーション層」で実行します(このクエリはレポート用に設計されており、ほとんどのレポート作成製品は条件付きのデータ出力をサポートしています)。

あなたは、このようにcase式を使用して出力を制御することができby句の選択とグループの両方にPROJECT_TYPE_RIDを含める場合、それは単にあなたのクエリ多くとは、ピボットは、より実現可能になります:

case when R.PROJECT_TYPE_RID = 1 then '' else Project_Name end AS Project_Name, 
    case when R.PROJECT_TYPE_RID = 3 then R.PROJECT_TYPE_NAME else '' end AS Project_Type_Brownfield, 
    case when R.PROJECT_TYPE_RID = 2 then R.PROJECT_TYPE_NAME else '' end AS Project_Type_VRP, 

をBUTノートは、PIVOTを使用したいので、ピボットが実行された後まで、このような値を抑制することはできません。