2014-10-09 52 views
0

我正在查询表中的一些基本信息,文件编号,案例类型,状态等。此外,我需要一个列的138个案件状态类型中的每一个将显示日期案件有这种地位。下面是一个示例:SQL选择语句中的动态子选择

SELECT FileNum, 
     CaseType, 
     CurrentCaseStatus, 
     (SELECT TOP 1 EventDt FROM caseStatusHistory WHERE CaseID = c.caseID AND CaseStatus = 'CS001' ORDER BY EventDt DESC) AS [Charge - Phone], 
     (SELECT TOP 1 EventDt FROM caseStatusHistory WHERE CaseID = c.caseID AND CaseStatus = 'CS002' ORDER BY EventDt DESC) AS [Charge - Written], 
     -- 136 more just like the live above 
FROM Case c 

我可以查询另一个表所有情况下的状态类型:

SELECT Code, Description 
FROM caseStatus 
WHERE Code BETWEEN 'CS001' AND 'CS138' 
ORDER BY Code 

我怎么能动态地创建每个这些列,而不必手动编写138条select语句的?

+0

收费文本是独一无二的每一行吗?作为[收费 - 电话]等 – TGH 2014-10-09 23:04:04

+0

是否描述相同的列名称电话 - 电话等,那么我们可以只使用组,根本不需要CASE – radar 2014-10-09 23:07:30

+0

是的,文本是独一无二的。 – 2014-10-14 15:50:30

回答

0

这将会非常缓慢 - 138个相关的子查询。我想你可以实现与OUTER JOIN与MAX一GROUP BYCASE相同的结果:

Select c.filenum, 
     c.casetype, 
     c.currentcasestatus, 
     max(case when csh.CaseStatus = 'CS001' then EventDt end) as [Charge - Phone], 
     max(case when csh.CaseStatus = 'CS002' then EventDt end) as [Charge - Written] 
from case c 
    left join casestatushistory csh on c.caseid = csh.caseid 
group by c.filenum, 
     c.casetype, 
     c.currentcasestatus 

BTW,我会建议只是写的声明出来 - 它不会花这么长时间,它会出来执行一个动态的sql方法。我不完全确定如何使用动态sql获取列名,除非PhoneWritten位于另一列中。

0

尝试使用PIVOT。下面的SQL应该工作 -

--Select the pivot data into a temp table 
SELECT c.caseID, 
    c.FileNum, 
    c.CaseType, 
    c.CurrentCaseStatus, 
    csh.EventDt, 
    cs.Description 
INTO #StatusDates 
FROM [Case] c 
LEFT JOIN caseStatusHistory csh 
ON csh.caseID = c.caseID 
LEFT JOIN caseStatus cs 
ON cs.Code = csh.CaseStatus 

--From the pivot data, get the list of field names (assumes description field is the source for the field name) 
DECLARE @statusDescriptions VARCHAR(MAX) 
SET @statusDescriptions = '' 
SELECT @statusDescriptions = COALESCE(@statusDescriptions+'[','') + Description 
FROM (
    SELECT DISTINCT Description 
    FROM #StatusDates 
    WHERE Description IS NOT NULL 
) x 
SET @statusDescriptions = REPLACE(@statusDescriptions, '[', '],[') + ']' 
SET @statusDescriptions = SUBSTRING(@statusDescriptions, 3, LEN(@statusDescriptions)) 

--Create a SQL statement to pivot the data into the fields. 
DECLARE @sql VARCHAR(MAX) 
SET @SQL = ' 
    SELECT * 
    FROM #StatusDates 
    PIVOT(MIN(EventDt) 
    FOR Description IN (' + @statusDescriptions + ')) 
    AS PVTTable ' 
PRINT @sql 
EXEC(@sql) 
DROP TABLE #StatusDates