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