因此,我为客户管理一个非常复杂的交叉表查询,该客户负责管理各所大学的学生资助。 该查询是动态的,因此将其作为长字符串存储在存储过程中,然后进行准备,执行和释放。
我已经能够提取最终查询,该查询的长度约为2000个字符。
select concat(s.LastName, ', ', s.FirstName, ' ', ifnull(s.MiddleInit, '')) as StudentName, p.SSN,
case @fullSSN when 0 then concat('xxxx-xx-', right(p.ssn, 4)) else concat(left(p.ssn, 3), '-',
substr(p.ssn, 4, 2), '-', right(p.ssn, 4)) end as formattedSSN,
sp.AwardYear, c.CampusName, es.EnrollmentStatus, sp.LoanPeriodFrom, sp.LoanPeriodTo, pg.ProgramName,
concat(s.Address1, ', ', s.City, ', ', s.State, ' ', s.Zip) as Address, s.Email, s.DOB,
sp.StartDate, sp.EndDate as LDA, sp.VerifyType,
sum(case when FedPgmName = 'DL Subsidized' then Amount end) as 'DL Subsidized',
sum(case when FedPgmName = 'DL Unsubsidized' then Amount end) as 'DL Unsubsidized',
sum(case when FedPgmName = 'Pell' then Amount end) as 'Pell',
sum(case when FedPgmName = 'DL PLUS' then Amount end) as 'DL PLUS',
sum(case when FedPgmName = 'FSEOG' then Amount end) as 'FSEOG',
sum(case when FedPgmName = 'FWS' then Amount end) as 'FWS'
from Payments as p inner join Student as s on p.SchoolID = s.SchoolID and p.SSN = s.SSN inner join
(select SchoolID, SSN, Max(StudentProfileID) as MaxProfileID from StudentProfile group by SchoolID,
SSN) as max on p.SchoolID = max.SchoolID and p.ssn = max.ssn inner join StudentProfile as sp on
max.SchoolID = sp.SchoolID and max.SSN = sp.SSN and max.MaxProfileID = sp.StudentProfileID inner
join Program as pg on sp.SchoolID = pg.SchoolID and sp.ProgramID = pg.ProgramID inner join as fp
on p.FedPgmID = fp.FedPgmID inner join Campuses as c on sp.SchoolID = c.SchoolID and sp.CampusID =
c.CampusID inner join EnrollmentStatus as es on sp.EnrollmentStatusID = es.EnrollmentStatusID where
p.SchoolID = 'cbd' and CkDate between '2018-01-01' and '2018-12-31' and sp.ProgramID in(161, 24, 25,
168, 165, 166, 14, 159, 160, 13, 150, 151, 17, 23, 10, 15, 2, 16, 3, 26, 9, 21, 22, 1, 11, 12, 19,
20, 4, 18, 8, 5, 6, 7) and p.FedPgmID in(1, 8, 9, 10, 5, 6, 23) and sp.EnrollmentStatusID in(1, 10,
2, 3, 4, 5, 6, 7, 8, 9) and ifnull(CkNo, 0) > 0 group by StudentName, SSN, formattedSSN, AwardYear,
CampusName, EnrollmentStatus, LoanPeriodFrom, LoanPeriodTo, ProgramName
确切地了解这里发生的情况并不重要,除了我的问题涉及上面的交叉表代码外,在该代码中有几种情况下使用不同的联邦程序名称。如果基础数据具有提到的所有不同程序,则一切正常。如果数据中缺少上述任何情况(例如,没有带“ FWS”的行),则该列不会显示在结果中,并且我的代码有问题,因为它期望返回所有列。>
所以我试图弄清楚如何确保所有列都被返回。如果将以下内容添加到生成的SQL代码的开头,则可以正常运行:
select '' as StudentName, '' as SSN, '' as formattedSSN, '' as AwardYear, '' as CampusName, '' as EnrollmentStatus,
'' as LoanPeriodFrom,
'' as LoanPeriodTo, '' as ProgramName, '' as Address, '' as Email, '' as DOB, '' as StartDate, '' as LDA, '' as VerifyType,
select 0 as 'DL Subsidized', 0 as 'DL Unsubsidized', 0 as 'Pell', 0 as 'DL PLUS', 0 as 'FSEOG', 0 as 'FWS'
union
使用上面的代码使查询成为联合查询即可。返回所有列,但是然后我必须在上面写一个“空”行。
请记住,查询非常复杂,必须使用大量concat构建,此外,我还必须执行group_concat才能获取可能的联邦计划的名称。这会为我创建case语句,然后将其插入到主SQL语句中。
因此,除了执行该联合查询之外,是否有任何方法可以强制所有列都显示? 希望我能解决这个问题。
谢谢...
编辑: 原来添加联合查询根本不起作用。我正在处理已经包含所有联邦计划记录的数据。如果我使用不包含某些联邦程序的数据集运行该联合查询,则会收到有关2个查询与列数不匹配的错误。因此,我仍然无法在交叉表部分返回所有可能的列。
答案 0 :(得分:0)
无法解决此问题,因此我以另一种方式解决了该问题。由于交叉表查询不会提供交叉表中基础数据中无效值的任何列,因此我创建了一个包含所有可能列的表,然后从交叉表查询中截断并填充该表。最后,从该表中选择。现在将显示所有可能的列。