【问题标题】:How do I merge 2 rows into 1 row in SQL?如何在 SQL 中将 2 行合并为 1 行?
【发布时间】:2021-03-23 18:32:13
【问题描述】:
ReportDateTime   EuId1 EuId2
2020-02-01 1:00  1576  Null    
2020-02-01 1:00  Null  1579    
2020-02-01 2:00  Null  1573    
2020-02-01 2:00  1566  Null

这就是我所拥有的,这就是我想要的……

 ReportDateTime   EuId1 EuId2    
 2020-02-01 1:00  1576  1579    
 2020-02-01 2:00  1566  1573

这是我的代码...

;WITH cteEq AS (
    SELECT e.EntHID, e.EntCode, e.EntName 
    FROM cfEntity fac (NOLOCK)
    JOIN cfEntityRelation er (NOLOCK) ON fac.EntHID = er.EntParentHID AND er.EntRelEffEnd = '12/31/2078'
    JOIN cfEntity e (NOLOCK) ON er.EntChildHID = e.EntHID AND e.EntTypeTID = -200020
    WHERE e.EntHID IN (SELECT ea.EaHID FROM cfEntityAttribute ea (NOLOCK) WHERE ea.EaKey = 'AirPermitXref_Diesel')
)
SELECT
    ReportDateTime = a.EqReportDate
    , EuId1 = CASE
       WHEN EntName LIKE '%EU1%' THEN a.EqPwr
       END
    , EuId2 = CASE
       WHEN EntName LIKE '%EU2%' THEN a.EqPwr
       END
FROM eqHourlyAir a (NOLOCK)
JOIN cteEq e (NOLOCK) ON a.EqHID = e.EntHID
OUTER APPLY (
    SELECT ad.EqHID, ad.EqReportDate, ad.EqRunTime
    FROM eqHourlyAir ad (NOLOCK)
    LEFT JOIN cfEntityAttribute ea (NOLOCK) ON ad.EqHID = CAST(ea.EaValue AS INT) AND ea.EaKey = 'AirPermitXref_DWI'
    WHERE ea.EaHID = a.EqHID 
    AND ad.EqReportDate = a.EqReportDate
) dwi
OUTER APPLY (
    SELECT ad.EqHID, ad.EqReportDate, ad.EqRunTime
    FROM eqHourlyAir ad (NOLOCK)
    LEFT JOIN cfEntityAttribute ea (NOLOCK) ON ad.EqHID = CAST(ea.EaValue AS INT) AND ea.EaKey = 'AirPermitXref_Diesel'
    WHERE ea.EaHID = a.EqHID 
    AND ad.EqReportDate = a.EqReportDate
) dsl
WHERE CAST(a.EqReportDate AS DATE) >= @StartDate AND CAST(a.EqReportDate AS DATE) <= @EndDate 
ORDER BY a.EqReportDate 

【问题讨论】:

  • 你为什么要发送垃圾邮件NOLOCK,你确实明白它的作用和它的严重影响,对吧?如果您真的需要针对每个表查询提示(最重要的提示,您不需要),那么您应该在开始时设置隔离级别,将NOLOCK 转储到任何地方。
  • 请分享完整的示例数据以便更好地理解,并请说明您在使用此代码时遇到的困难。
  • 如果您必须使用 nolock,了解后果,并准备处理错误或不正确的数据,那么至少使用当前语法而不是弃用的语法。
  • 另外,一个讨厌的人,the semicolon (;) is a statement terminator不是一个“初学者”。它位于 所有 语句的 end 处,而不是需要正确终止 previous 语句的语句的开头。

标签: sql sql-server tsql merge row


【解决方案1】:
  1. 使用 nolock 提示不是最好的主意!
  2. 如果每个报告日期只有一个空值和一个非值,则可以按 ReportDateTime 分组并获得最大值:
...
SELECT
    ReportDateTime = a.EqReportDate,
    EuId1 = MAX(CASE WHEN EntName LIKE '%EU1%' THEN a.EqPwr END),
    EuId2 = MAX(CASE WHEN EntName LIKE '%EU2%' THEN a.EqPwr END)
FROM
 {...}
WHERE
    CAST(a.EqReportDate AS DATE) >= @StartDate
    AND CAST(a.EqReportDate AS DATE) <= @EndDate
GROUP BY a.EqReportDate
ORDER BY
    a.EqReportDate

【讨论】:

    【解决方案2】:

    从您的样本数据中很容易选择您想要的结果,如下所示:

    select ReportDateTime  ,max(EuId1) EuId1,max(EuId2) EuId2 from 
    (select * from table1 join table2 on .... )t
    group by ReportDateTime  
    

    但您的查询表明故事还有更多内容。请分享更多信息。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2023-01-30
      • 2012-06-26
      • 2012-06-20
      • 2018-10-20
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多