栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQL查询-多列的SUM(WHEN x THEN 1 ELSE 0的情况)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL查询-多列的SUM(WHEN x THEN 1 ELSE 0的情况)

我将通过以下方式更改查询:

  1. 在子查询中进行聚合。这样可以利用有关表格的更多信息来优化
    group by
  2. 合并第二个和第三个子查询。它们聚集在同一列上。这需要使用
    left outer join
    来确保所有数据都可用。
  3. 通过使用,
    count(<fieldname>)
    您可以消除与的比较
    is null
    。这对于第二和第三计算值很重要。
  4. 要组合第二个查询和第三个查询,它需要从
    mde
    表中计算一个ID 。这些使用
    mde.mdeid

以下版本通过使用来遵循您的示例

union all

SELECt CAST(Detail.ReceiptDate AS DATE) AS "Date",       SUM(TOTALMAILED) as TotalMailed,       SUM(TOTALUNDELINOTICESRECEIVED) as TOTALUNDELINOTICESRECEIVED,       SUM(TRACEUNDELNOTICESRECEIVED) as TRACEUNDELNOTICESRECEIVEDFROM ((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;      )     ) detailGROUP BY CAST(Detail.ReceiptDate AS DATE)ORDER BY 1;

以下使用做了类似的事情

full outer join

SELECt coalesce(sd.ReceiptDate, mde.ReceiptDate) AS "Date",       sd.TotalMailed, mde.TOTALUNDELINOTICESRECEIVED,       mde.TRACEUNDELNOTICESRECEIVEDFROM (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.ReceiptDateORDER BY 1;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号