0

今までうまく機能するピボット クエリがありますが、条件に一致しない行と列の値を省略し、null を表示するアンピボット クエリで条件を指定する必要があるという要件がありました。ただし、それらの値を最終結果の一部として示す必要があります。

欠損値を含めるためにユニオンを実行しようとしましたが、目的の出力が得られません。表示される結果と結果として表示する必要がある結果とともに、ピボット クエリを以下に貼り付けます。助けてください。

現在のクエリ

SELECT 
    OrderID, AccessName, Address1, Postcode
    , Gen_Instr_1 AS "General Instructions for Install"
    ,Supplier_Name_1 AS "Supplier Name"
    ,Install_Job_Name_1 AS "Install Jobs"
    ,Install_Job_Status_1 AS "Install Job Status"

    ,Install_Job_Name_2 AS "EPR Jobs"
    ,Install_Job_Status_2 AS "EPR Job Status"
FROM
(
    SELECT
    OrderID, AccessName, Address1, Postcode
    , col+'_'+CAST(rn AS VARCHAR(10)) col, 
    val
    FROM
    (
        SELECT o.OrderID, 
            CAST(js.JobStatusID AS VARCHAR(50)) JobStatusId
            , CAST(p.Name AS VARCHAR(50)) Install_Job_Name 
            , o.AccessName, o.Address1, o.Postcode
            , CAST(oj.GeneralInstructions AS VARCHAR(50)) Gen_Instr  
            , CAST(s.CompanyName AS VARCHAR(50)) Supplier_Name 
            , oj.SupplierID 
            , CAST(js.Name AS VARCHAR(50)) Install_Job_Status  
            , ROW_NUMBER() OVER(PARTITION BY o.OrderID ORDER BY o.OrderID) rn
        FROM 
            NEPCCO.Orders o
            INNER JOIN NEPCCO.Clients c ON o.ClientID = c.ClientID
            INNER JOIN NEPCCO.OrderJobs oj ON o.OrderID = oj.OrderID
            INNER JOIN NEPCCO.Suppliers s ON oj.SupplierID = s.SupplierID
            INNER JOIN NEPCCO.Products p ON oj.ProductID = p.ProductID
            INNER JOIN NEPCCO.OrderStatus os ON o.OrderStatusID = os.OrderStatusID
            INNER JOIN NEPCCO.JobStatus js ON oj.JobStatusID = js.JobStatusID
        WHERE
            o.OrderID IN (6981,6860,6982,6983) AND
            (p.ProductID IN (35,36,37,38,38,40,41,42,43) OR  p.ProductID IN (33,34))
            AND s.CompanyName = 'Northern Gas Heating Ltd'
    ) d
    UNPIVOT
    (
        val
        FOR col IN (JobStatusId, Gen_Instr, Supplier_Name,Install_Job_Name, Install_Job_Status)
    ) un
) s
PIVOT
(
    MAX(val)
    FOR col IN (JobStatusID_1, Gen_Instr_1, Supplier_Name_1, Install_Job_Name_1, Install_Job_Status_1,
                JobStatusID_2, Gen_Instr_2, 
                Install_Job_Name_2, Install_Job_Status_2
                )
) piv

現在の結果 - 最後の 2 つの列の NULL 値を参照してください

OrderID AccessName Address1 Postcode SupplierName Install Jobs Install Job Status EPR Jobs EPR Job Status
    6981    Mrs Cespedes    73 Mill Lane    WV11 1DQ    Northern Gas Heating Ltd    GC1 - 28    Complete    NULL    NULL
    6983    Ms A Mirza  122 Pendleford Avenue   WV6 9EN     Northern Gas Heating Ltd    GC1 - 28    Complete    NULL    NULL

ここで、以下のように内側のピボット解除クエリを実行すると、次のレコード/行が取得されます

内部アンピボット クエリ

SELECT o.OrderID, 
            CAST(js.JobStatusID AS VARCHAR(50)) JobStatusId
            , CAST(p.Name AS VARCHAR(50)) Install_Job_Name
            , o.AccessName, o.Address1, o.Postcode
            , CAST(oj.GeneralInstructions AS VARCHAR(50)) Gen_Instr
            , CAST(s.CompanyName AS VARCHAR(50)) Supplier_Name
            , oj.SupplierID 
            , CAST(js.Name AS VARCHAR(50)) Install_Job_Status  
            , ROW_NUMBER() OVER(PARTITION BY o.OrderID ORDER BY o.OrderID) rn1
        FROM 
            NEPCCO.Orders o
            INNER JOIN NEPCCO.Clients c ON o.ClientID = c.ClientID
            INNER JOIN NEPCCO.OrderJobs oj ON o.OrderID = oj.OrderID
            INNER JOIN NEPCCO.Suppliers s ON oj.SupplierID = s.SupplierID
            INNER JOIN NEPCCO.Products p ON oj.ProductID = p.ProductID
            INNER JOIN NEPCCO.OrderStatus os ON o.OrderStatusID = os.OrderStatusID
            INNER JOIN NEPCCO.JobStatus js ON oj.JobStatusID = js.JobStatusID
        WHERE
            o.OrderID IN (6981,6860,6982,6983) AND
            (p.ProductID IN (35,36,37,38,38,40,41,42,43) OR  p.ProductID IN (33,34))

次の結果を生成します

 OrderID AccessName Address1 Postcode SupplierName Install Jobs Install Job Status EPR Jobs EPR Job Status

6860    6   AW EPR  01625555555 1 Gorsey Road   SK9 5DU     OGP 14  Cancelled     1
6981    4   AW EPR  Mrs Cespedes    73 Mill Lane    WV11 1DQ    Ian Barnhurst   1   Complete       1
6981    4   GC1 - 28    Mrs Cespedes    73 Mill Lane    WV11 1DQ    Northern Gas Heating Ltd    403 Complete      2
6982    4   AW EPR Installer    Mr N Singh  115 Oxbarn Avenue   WV3 7HQ     Northern Gas    414 Complete      1
6983    4   AW EPR Installer    Ms A Mirza  122 Pendleford Avenue   WV6 9EN Northern Gas    414 Complete      1
6983    4   GC1 - 28    Ms A Mirza  122 Pendleford Avenue   WV6 9EN     Northern Gas Heating Ltd    403 Complete     2

問題

ここで、注文 ID を持つ上記の結果セットを注意深く見ると6860, 6982、サプライヤー名が として取得されていないため、上記の結果の一部として含まれていませんNorthern Gas Heating Ltd。さらに、最初のクエリで表示される結果は省略されます。オーダー ID の値6981, 6983も、サプライヤーが異なるためです。

また、最初のクエリでレコードが表示されている場合、行番号 2 の値は含まれていません。

私は最善を尽くしたが失敗した。@bluefeet、ここではあなたの専門知識が非常に必要です。不明な点はお尋ねください。

4

0 に答える 0