C# SQL查询“Case”-在同一行上显示结果

C# SQL查询“Case”-在同一行上显示结果,c#,sql,database-administration,C#,Sql,Database Administration,我试图从表处理的文件日志中获取2个已提交文件的状态,无论是“通过”、“失败”还是“未提交” 第一个文件名在文件名中不包含“PCR”,第二个文件名在文件名中包含“PCR”,这就是我如何区分这两个文件的原因 合同是提交这2个文件的合同,我将组合4个不同的表来填充以下内容 当我运行我的查询[下面]时,此表有两个问题: i、 "不管查询结果如何,H0000'都会被重复,以获取MAXPF.processed_日期-我正在尝试获取文件1和文件2的上次处理状态 二,。对于“H0000”,两个文件的状态不显示在

我试图从表处理的文件日志中获取2个已提交文件的状态,无论是“通过”、“失败”还是“未提交”

第一个文件名在文件名中不包含“PCR”,第二个文件名在文件名中包含“PCR”,这就是我如何区分这两个文件的原因

合同是提交这2个文件的合同,我将组合4个不同的表来填充以下内容

当我运行我的查询[下面]时,此表有两个问题:

i、 "不管查询结果如何,H0000'都会被重复,以获取MAXPF.processed_日期-我正在尝试获取文件1和文件2的上次处理状态

二,。对于“H0000”,两个文件的状态不显示在同一行中。这意味着-文件1的状态显示在一行中,文件2的状态显示在第二行中

我的问题是:

select  distinct
          
          OC.cms_contract_number as 'Contract #'  
          ,case when (PF.PROCESSED_FILE_NAME not like '%PCR%' and FS.DISPLAY is not null) then FS.display   else 'Not Submitted' end as 'File 1 Status'
          ,case when (PF.PROCESSED_FILE_NAME like '%PCR%'  and FS.DISPLAY is not null) then FS.display   else 'Not Submitted'  end as 'File 2 Status'
          ,MAX(PF.processed_date) as 'Date Submitted'
          
   from 
                  ((((persons P join person_affiliations PA on P.person_id = PA.person_id)
          join external_orgs EO on EO.org_id = PA.org_id)
          join org_contracts OC on OC.org_contracts_id = PA.org_contracts_id)
          left outer join      processed_file_logs PF on PF.org_contracts_id = OC.org_contracts_id)
          left outer join processed_file_status FS on FS.file_status_id = PF.file_status_id 
   group by  OC.CMS_CONTRACT_NUMBER,  PF.SUBMISSION_ID,
     FS.DISPLAY, PF.PROCESSED_FILE_NAME

我哪里出错了?

好的,更新此答案以反映您的以下评论-这里有很多语法我可能弄错了,如果不访问这些表,我不太可能为您提供完美的最终解决方案,但您可以这样做:

基本上,您的数据是不连贯的,因为您希望将跨多行的数据汇总到两个不同的列中。我们可以使用with查询创建数据表,这些数据表将查找两个文件中每个文件的最后一次提交,然后通过合同编号键将其与主数据集重新匹配

With A as (select OC.cms_contract_number as cms_contract_number, PF.PROCESSED_FILE_NAME as PROCESSED_FILE_NAME, FS.DISPLAY as DISPLAY, PF.processed_date as processed_date
from 
          ((((persons P join person_affiliations PA on P.person_id = PA.person_id)
  join external_orgs EO on EO.org_id = PA.org_id)
  join org_contracts OC on OC.org_contracts_id = PA.org_contracts_id)
  left outer join      processed_file_logs PF on PF.org_contracts_id = OC.org_contracts_id)
  left outer join processed_file_status FS on FS.file_status_id = PF.file_status_id )

select  distinct

  A.cms_contract_number as 'Contract #'  
  ,max(s1.FileStatus) as 'File 1 Status'
  ,max(s2.FileStatus) as 'File 2 Status'
  ,MAX(A.processed_date) as 'Date Submitted'

from A
left outer join 
(
    select  distinct

      A.cms_contract_number as 'Contract'  
      ,case when (A.DISPLAY is not null) then A.display   else 'Not Submitted' end as 'FileStatus'
      ,MAX(A.processed_date) as 'DateSubmitted'

    from  A
    where A.PROCESSED_FILE_NAME not like '%PCR%' or A.PROCESSED_FILE_NAME is null 
    group by  A.CMS_CONTRACT_NUMBER, case when (A.DISPLAY is not null) then A.display   else 'Not Submitted' end 
) s1 on s1.Contract = A.CMS_CONTRACT_NUMBER and s1.DateSubmitted = A.processed_date
left outer join
(
    select  distinct

      A.cms_contract_number as 'Contract'  
      ,case when (A.DISPLAY is not null) then A.display   else 'Not Submitted' end as 'FileStatus'
      ,MAX(A.processed_date) as 'DateSubmitted'

    from  A
    where A.PROCESSED_FILE_NAME like '%PCR%'  or A.PROCESSED_FILE_NAME is null 
    group by  A.CMS_CONTRACT_NUMBER, case when (A.DISPLAY is not null) then A.display   else 'Not Submitted' end 
) s2 on s2.Contract = A.CMS_CONTRACT_NUMBER and s2.DateSubmitted = A.processed_date
group by  A.CMS_CONTRACT_NUMBER
还要注意的是,如果您想知道每个文件1和文件2上次提交的日期,那么现在将其取出也是一个相当简单的练习:

在主查询中,仅需更改:

MAX(PF.processed_date) as 'DateSubmitted' 
致:


如果通过从组中删除PF.SUBMISSION\u ID会发生什么情况?这是否在microsoft access中?请标记您正在使用的dbms。@jarlh,我收到一个错误,说“Column”已处理\u fole\u日志。SUBMISSION\u ID“在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY中clause@SqlZim,这是SQL Server 2008R2@Ron请不要在连接周围使用括号,而不记录这样做的原因。它会对查询的运行方式产生重大影响,如果您不知道为什么要这样做,请不要这样做。这相当于使用查询提示强制联接顺序。好吧,这就是在CTE with语句中使用select*的危险。联接必须从多个表返回相同的列名。要解决这个问题,您需要从联接表中键入要用来替换select语句中*的每一列。如果要使用联接中两个表中具有相同名称的列,则需要对这些列使用别名。我会试一试,但如果我错过了一次,只需将“error column”添加到列表中。嗯,不确定你在哪个数据库上。这将在Oracle中起作用,但可能需要对SQL Server或其他DB稍微进行调整。由于返回的值应该已经是“max”,并且应该是单个值,因此您可以完全删除这些函数上的“max”函数。如果删除max函数,您可能还需要将别名“File 1 Status”和“File 2 Status”添加到组中。查看一些StackOverflow文章,根据DB将With语句更改为主查询中的联接可能会很有用。Ok,我已经用包含分组函数的语句重构了CTE,使它们成为联接。这似乎解决了SQL Server中其他类似错误的大多数问题。我修改了您的查询,在第12行和第13行将MAXs1.FileStatus添加为“文件1状态”,将MAXs2.FileStatus添加为“文件2状态”,现在得到了所需的结果。但是对于文件1和文件2,对于空值,我没有获得“未提交”的状态。感谢您的大力帮助@user681574——
max((select s1.DateSubmitted from StatusOfLastFile1 s1 where s1.Contract = A.CMS_CONTRACT_NUMBER)) as 'File 1 Last Submit',
max((select s2.DateSubmitted from StatusOfLastFile2 s2 where s2.Contract = A.CMS_CONTRACT_NUMBER)) as 'File 2 Last Submit'