【问题标题】:How do you join two calculated sql statement?你如何加入两个计算的sql语句?
【发布时间】:2023-03-04 02:08:02
【问题描述】:

下面的语句联合了这两个查询,但为没有计算值的公司留下了空值。如何从这两列中删除空值?或者有没有更好的方法将这两个计算列组合到一个表中。谢谢。

SELECT Company,

       Sum(CASE
               WHEN voltage = '99 kV' THEN number * 1
               WHEN voltage = '199 kV' THEN number * 2
               WHEN voltage = '299 kV' THEN number * 3
               WHEN voltage = '399 kV' THEN number * 4
               WHEN voltage = '599 kV' THEN number * 5
               WHEN voltage = '799 kV' THEN number * 6
               ELSE 0
           END) AS 'score1',
       NULL AS score2
FROM Table1    
WHERE [year] = '2020'     
GROUP  BY Company    
UNION ALL    
SELECT Company,    
       NULL AS score1,
       Sum(CASE
               WHEN voltage = '99 kV' THEN number * 1
               WHEN voltage = '199 kV' THEN number * 2
               WHEN voltage = '299 kV' THEN number * 3
               WHEN voltage = '399 kV' THEN number * 4
               WHEN voltage = '599 kV' THEN number * 5
               WHEN voltage = '799 kV' THEN number * 6
               ELSE 0
           END) AS 'score2'
FROM Table2    
WHERE [year] = '2020'     
GROUP  BY Company    
ORDER BY Company

【问题讨论】:

  • 谢谢并道歉。
  • 尝试合并 2 个表之前进行聚合。

标签: sql union union-all


【解决方案1】:

您可以将 NULL 值替换为空字符串:

isnull(convert(varchar(36),col),'') as ...

这应该可以做到。

【讨论】:

  • 我将如何获得一个得分 1 和得分 2 的独特公司?而不是在 2 个单独的行上拥有同一家公司?
【解决方案2】:

我会选择以下方法,因为它减少了重复代码...

SELECT
  company,
  SUM(CASE WHEN source = 1 THEN score ELSE 0 END)   AS score1,
  SUM(CASE WHEN source = 2 THEN score ELSE 0 END)   AS score2
FROM
(
  SELECT
    company,
    [year],
    source,
    CASE
      WHEN voltage = '99 kV'  THEN number * 1
      WHEN voltage = '199 kV' THEN number * 2
      WHEN voltage = '299 kV' THEN number * 3
      WHEN voltage = '399 kV' THEN number * 4
      WHEN voltage = '599 kV' THEN number * 5
      WHEN voltage = '799 kV' THEN number * 6
      ELSE 0
    END
      AS score
  FROM
  (
    SELECT company, [year], 1 AS source, voltage, number FROM Table1
    UNION ALL
    SELECT company, [year], 2 AS source, voltage, number FROM Table2
  ) 
    AS combined
) 
  AS scored
WHERE
  [year] = 2020
GROUP BY
  company
ORDER BY
  company

使用公用表表达式而不是子查询可以使其更简洁,但您没有指定您使用的数据库和版本,所以我没有包括在内。

【讨论】:

    【解决方案3】:

    你可以使用join:

    select t1.company, t1.score1, t2.score2
    from (<query1>
         ) t1 join
         (<query2>
         ) t2
         on t1.company = t2.company;
    

    这仅返回两个结果集中的公司。如果您想要某个结果集中缺少的公司,您可能需要某种外部联接。如果您使用外连接,您可能需要在select 中使用coalesce(t1.company, t2.company)

    【讨论】:

    • 我使用了完全外连接。在 t1 中有计算值,但在 t2 中没有,反之亦然。因此,如果该值在 t2 中,则该值的公司列为空。
    • @ycao 在使用FULL OUTER JOIN 时使用SELECT COALESCE(t1.company, t2.company) AS company, ...。这样,如果一个为 NULL,那么您将使用另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2019-11-16
    • 2017-07-07
    • 1970-01-01
    • 2011-02-18
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多