我想看看下面是否有更好的查询方法。我想做的是创建一个摘要报告,按日期编译统计信息。
SELECT CAST(Detail.ReceiptDate AS DATE) AS 'DATE' , SUM(CASE WHEN Detail.Type = 'TotalMailed' THEN 1 ELSE 0 END) AS 'TOTALMAILED' , SUM(CASE WHEN Detail.Type = 'TotalReturnMail' THEN 1 ELSE 0 END) AS 'TOTALUNDELINOTICESRECEIVED' , SUM(CASE WHEN Detail.Type = 'TraceReturnedMail' THEN 1 ELSE 0 END) AS 'TRACEUNDELNOTICESRECEIVED' FROM ( select SentDate AS 'ReceiptDate', 'TotalMailed' AS 'Type' from MailDataExtract where sentdate is not null UNION ALL select MDE.ReturnMailDate AS 'ReceiptDate', 'TotalReturnMail' AS 'Type' from MailDataExtract MDE where MDE.ReturnMailDate is not null UNION ALL select MDE.ReturnMailDate AS 'ReceiptDate', 'TraceReturnedMail' AS 'Type' from MailDataExtract MDE inner join DTSharedData.dbo.ScanData SD ON SD.ScanDataID = MDE.ReturnScanDataID where MDE.ReturnMailDate is not null AND SD.ReturnMailTypeID = 1 ) AS Detail GROUP BY CAST(Detail.ReceiptDate AS DATE) ORDER BY 1
这只是查询的一个示例(在报表中使用),因为还有许多其他列,并且其他统计信息的逻辑更加复杂。是否有更优雅的方法来获取此类信息/撰写此类报告?
我将通过以下方式更改查询:
group by
left outer join
count(<fieldname>)
is null
mde
mde.mdeid
以下版本通过使用来遵循您的示例union all:
union all
SELECT CAST(Detail.ReceiptDate AS DATE) AS "Date", SUM(TOTALMAILED) as TotalMailed, SUM(TOTALUNDELINOTICESRECEIVED) as TOTALUNDELINOTICESRECEIVED, SUM(TRACEUNDELNOTICESRECEIVED) as TRACEUNDELNOTICESRECEIVED FROM ((select SentDate AS "ReceiptDate", COUNT(*) as TotalMailed, NULL as TOTALUNDELINOTICESRECEIVED, NULL as TRACEUNDELNOTICESRECEIVED from MailDataExtract where SentDate is not null group by SentDate ) union all (select MDE.ReturnMailDate AS ReceiptDate, 0, COUNT(distinct mde.mdeid) as TOTALUNDELINOTICESRECEIVED, SUM(case when sd.ReturnMailTypeId = 1 then 1 else 0 end) as TRACEUNDELNOTICESRECEIVED from MailDataExtract MDE left outer join DTSharedData.dbo.ScanData SD ON SD.ScanDataID = MDE.ReturnScanDataID group by MDE.ReturnMailDate; ) ) detail GROUP BY CAST(Detail.ReceiptDate AS DATE) ORDER BY 1;
以下使用做了类似的事情full outer join:
full outer join
SELECT coalesce(sd.ReceiptDate, mde.ReceiptDate) AS "Date", sd.TotalMailed, mde.TOTALUNDELINOTICESRECEIVED, mde.TRACEUNDELNOTICESRECEIVED FROM (select cast(SentDate as date) AS "ReceiptDate", COUNT(*) as TotalMailed from MailDataExtract where SentDate is not null group by cast(SentDate as date) ) sd full outer join (select cast(MDE.ReturnMailDate as date) AS ReceiptDate, COUNT(distinct mde.mdeID) as TOTALUNDELINOTICESRECEIVED, SUM(case when sd.ReturnMailTypeId = 1 then 1 else 0 end) as TRACEUNDELNOTICESRECEIVED from MailDataExtract MDE left outer join DTSharedData.dbo.ScanData SD ON SD.ScanDataID = MDE.ReturnScanDataID group by cast(MDE.ReturnMailDate as date) ) mde on sd.ReceiptDate = mde.ReceiptDate ORDER BY 1;