【问题标题】:Removing Sub queries to PIVOT table删除对 PIVOT 表的子查询
【发布时间】:2019-04-23 21:58:59
【问题描述】:

我有一个使用子查询的查询,但我想让它更高效、更容易工作。我一直在研究 PIVOT 逻辑,但似乎无法让它发挥作用。以下是原始子查询逻辑,有人可以帮助我或指出正确的方向。

SELECT 
    Parent.id
    ,[sitecode]
    ,[started]
    ,[completed]
    ,cast(( completed - started) as time)               
    ,[profileId]
    ,(SELECT TOP 1 CAST(RTRIM(LTRIM(REPLACE(REPLACE(CAST(Child.message as NVarchar(4000)) , 'Initialized', ''),'demographic records',''))) AS NVarchar(4000)) FROM [backend].[dbo].[Transaction_StatusMessage] AS Child WHERE Child.transactionId =Parent.Id  AND child.message like '%Initialized%' AND child.message like '%demographic records%'  ORDER BY Child.created DESC) AS Dem
    ,(SELECT TOP 1 CAST(RTRIM(LTRIM(REPLACE(REPLACE(CAST(Child.message as NVarchar(4000)) , 'Initialized', ''),'clinical records',''))) AS NVarchar(4000)) FROM [backend].[dbo].[Transaction_StatusMessage] AS Child WHERE child.message like '%Initialized%' AND child.message like '%clinical records%' AND Child.transactionId =Parent.Id ORDER BY Child.created DESC) AS Clincial        
    ,(SELECT TOP 1 CAST(RTRIM(LTRIM(REPLACE(CAST(Child.message as NVarchar(4000)),'Total valid patient types:',''))) AS NVarchar(4000)) FROM [backend].[dbo].[Transaction_StatusMessage] AS Child WHERE child.message like 'Total valid patient types:%' AND Child.transactionId =Parent.Id ORDER BY Child.created DESC) AS ValidPatientTypes
    ,(SELECT TOP 1 CAST(RTRIM(LTRIM(REPLACE(CAST(Child.message as NVarchar(4000)),'Total invalid patient types:',''))) AS NVarchar(4000)) FROM [backend].[dbo].[Transaction_StatusMessage] AS Child WHERE child.message like 'Total invalid patient types:%' AND Child.transactionId =Parent.Id ORDER BY Child.created DESC) AS NotValidPatientTypes
  FROM [Backend].[dbo].[Transaction] AS Parent
  where completed > '2018-11-17 00:00:00.00' AND transactionType = 'BulkImport' AND profileId = 122 
  order by sitecode, completed desc

任何帮助谢谢。 即使 Pivot 不起作用,有人可以指出我更好的逻辑

【问题讨论】:

    标签: sql sql-server select subquery pivot


    【解决方案1】:

    您可以将这些子查询转换为OUTER APPLY

    SELECT 
        Parent.id
        ,[sitecode]
        ,[started]
        ,[completed]
        ,cast(( completed - started) as time)               
        ,[profileId]
        ,Child.Dem
        ,Child.Clincial        
        ,Child.ValidPatientTypes
        ,Child.NotValidPatientTypes
    FROM    [Backend].[dbo].[Transaction] AS Parent
        OUTER APPLY
        (
            SELECT  TOP 1 
                MAX (CASE WHEN Child.message like '%Initialized%' AND Child.message like '%demographic records%'
                      THEN CAST(RTRIM(LTRIM(REPLACE(REPLACE(CAST(Child.message as NVarchar(4000)) , 'Initialized', ''),'demographic records',''))) AS NVarchar(4000))
                      END) AS Dem,
                MAX (CASE WHEN Child.message like '%Initialized%' AND child.message like '%clinical records%'
                      THEN CAST(RTRIM(LTRIM(REPLACE(REPLACE(CAST(Child.message as NVarchar(4000)) , 'Initialized', ''),'clinical records',''))) AS NVarchar(4000))
                      END) AS Clinical,
                MAX (CASE WHEN Child.message like 'Total valid patient types:%'
                      THEN CAST(RTRIM(LTRIM(REPLACE(CAST(Child.message as NVarchar(4000)),'Total valid patient types:',''))) AS NVarchar(4000)) 
                      END) AS ValidPatientTypes,
                MAX (CASE WHEN Child.message like 'Total invalid patient types:%'
                      THEN CAST(RTRIM(LTRIM(REPLACE(CAST(Child.message as NVarchar(4000)),'Total invalid patient types:',''))) AS NVarchar(4000))
                      END) AS NotValidPatientTypes
            FROM    [backend].[dbo].[Transaction_StatusMessage] AS Child 
            WHERE   Child.transactionId = Parent.Id  
            ORDER BY Child.created DESC
        ) Child
    WHERE completed       > '2018-11-17 00:00:00.00' 
    AND   transactionType = 'BulkImport' 
    AND   profileId       = 122 
    ORDER BY sitecode, completed desc
    

    【讨论】:

    • 感谢松鼠,这帮助很大。我遇到了一个子查询返回空值的问题,我想从主结果中删除该行。再次感谢
    猜你喜欢
    • 2014-02-16
    • 2012-07-24
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多