【问题标题】:Joining and Counting in the same query without double calculation of field在同一个查询中加入和计数,无需重复计算字段
【发布时间】:2012-07-11 12:25:36
【问题描述】:

我正在根据特定条件加入一些表格。我想知道是否可以同时显示从联接中排除的那些记录的计数?

我的查询:

SELECT...

FROM         dbo.QuickLabDump 
             ...

             left outer join hermes.lom.dbo.lom_specimen Lom
              on QuickLabDump.[specimen id] = lom.specimen
              LEFT outer join SalesDWH.dbo.Isomers Isomers
              on QuickLabDump.[specimen id] = Isomers.[accession id]



WHERE     lom.specimen is null
              and isomers.[accession id] is null...

如您所见,我有两个左外连接。

除了这个查询的结果,我还想返回那些被排除在外的hermes.lom.dbo.lom_specimenSalesDWH.dbo.Isomers 记录的计数。

如何获取排除字段的计数?

这里是完整的查询:

USE [SalesDWH]
GO

/****** Object:  View [dbo].[TurnAround]    Script Date: 07/10/2012 20:46:40 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO






ALTER VIEW [dbo].[TurnAround]
AS
SELECT     dbo.QuickLabDump.[Specimen ID], DATEPART(yyyy, dbo.QuickLabDump.[Date Entered]) AS [Year Entered],
DATEPART(yyyy, dbo.QuickLabDump.[Date Completed]) AS [year completed],

 CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) 
                      AS DATETIME) + CAST(dbo.QuickLabDump.[Time Entered] AS TIME) AS [DateTime Entered], CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
                      + CAST(dbo.QuickLabDump.[Time Completed] AS TIME) AS [DateTime Completed], dbo.QuickLabDump.[Practice Code] AS [QL Practuce Code], 
                      dbo.QLMLISMapping.[MLIS Practice ID], DATEPART(m, dbo.QuickLabDump.[Date Entered]) AS [Month Entered], 
                      DATEPART(m, dbo.QuickLabDump.[Date Completed]) AS [Month Completed],
                      ROUND(CAST(DATEDIFF(mi, 
                      CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) + CAST(dbo.QuickLabDump.[Time Entered] AS TIME), 
                      CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS FLOAT) / 60, 0) AS TAT, 
                      ROUND(CAST(DATEDIFF(mi, CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) + CAST('9:00AM' AS TIME), 


                      CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
                      + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS float) / 60, 0) 

                      AS [Hours TurnAround Since 9AM], TAT9AMStateAdjusted=                   



                      ROUND(CAST(DATEDIFF(mi, CAST(CAST(dbo.QuickLabDump.[Date Entered] AS DATE) AS DATETIME) 
                      + CAST('9:00AM' AS TIME),                                            
                      CAST(CAST(dbo.QuickLabDump.[Date Completed] AS DATE) AS DATETIME) 
                      + CAST(dbo.QuickLabDump.[Time Completed] AS TIME)) AS float) / 60, 0)                         


                      +dbo.adjustedtime.timedifference
                      ,dbo.QuickLabDump.[Order Count], CONVERT(VARCHAR(8), DATEADD(D, - (1 * DATEPART(dw, dbo.QuickLabDump.[Date Entered])) + 6,
                       dbo.QuickLabDump.[Date Entered]), 1) AS [Week Ending]
FROM         dbo.QuickLabDump 
             INNER JOIN dbo.QLMLISMapping 
             ON dbo.QuickLabDump.[Practice Code] = dbo.QLMLISMapping.[Quicklab ID]
             left outer join dbo.AccountState
             on dbo.QuickLabDump.[Practice Code]=dbo.AccountState.[Account]
             left outer join dbo.AdjustedTime 
             ON dbo.AccountState.[state]=dbo.adjustedtime.[state]

             left outer join hermes.lom.dbo.lom_specimen Lom
              on QuickLabDump.[specimen id] = lom.specimen
              LEFT outer join SalesDWH.dbo.Isomers Isomers
              on QuickLabDump.[specimen id] = Isomers.[accession id]



WHERE     lom.specimen is null
              and isomers.[accession id] is null

              and (dbo.QuickLabDump.[Practice Code] NOT LIKE 'test%') 
              AND (dbo.QuickLabDump.[Specimen ID] NOT LIKE 'of%') 
              AND (dbo.QuickLabDump.Outcome <> 'rejected')
GROUP BY dbo.QuickLabDump.[Specimen ID], dbo.QuickLabDump.[Date Entered], dbo.QuickLabDump.[Time Entered], dbo.QuickLabDump.[Date Completed], 
                      dbo.QuickLabDump.[Time Completed], dbo.QuickLabDump.[Practice Name], dbo.QuickLabDump.[Practice Code], dbo.QuickLabDump.[Order Count], 
                      dbo.QLMLISMapping.[MLIS Practice ID],dbo.adjustedtime.timedifference
HAVING      (dbo.QuickLabDump.[Order Count] = MAX(dbo.QuickLabDump.[Order Count])) OR
                      (dbo.QuickLabDump.[Order Count] IS NULL)






GO

【问题讨论】:

  • 您选择了哪些列?
  • 我不确定这有什么帮助,但我包含了整个查询
  • 您可以使用 group by,但使用所有这些列...
  • 您想要排除的行总数还是排除行的每个表的计数?
  • @ZaneBien 每张桌子的计数

标签: sql sql-server sql-server-2008


【解决方案1】:

你在找这个吗?

SELECT      ...,
            (
              SELECT COUNt(*) FROM hermes.lom.dbo.lom_specimen WHERE specimen = lom.specimen
             ) AS ColCount

FROM         dbo.QuickLabDump    
             left outer join hermes.lom.dbo.lom_specimen Lom   
              on QuickLabDump.[specimen id] = lom.specimen   
              LEFT outer join SalesDWH.dbo.Isomers Isomers   
              on QuickLabDump.[specimen id] = Isomers.[accession id]   
WHERE     lom.specimen is null   
              and isomers.[accession id] is null

【讨论】:

    【解决方案2】:

    在没有 WHERE 子句的情况下运行相同的查询并使用 FULL OUTER JOIN 将为您提供可选 Universe 中的所有行。

    【讨论】:

    • 非常感谢您的回答,您能详细说明一下吗?
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多