你如何加入两个计算的sql语句?

Posted

技术标签:

【中文标题】你如何加入两个计算的sql语句?【英文标题】:How do you join two calculated sql statement? 【发布时间】:2021-01-15 19:30:11 【问题描述】:

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

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 个表之前进行聚合。 【参考方案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,那么您将使用另一个。

以上是关于你如何加入两个计算的sql语句?的主要内容,如果未能解决你的问题,请参考以下文章

一个sql存储过程中@sql语句加入引号的问题

如何计算sql中where语句中的行数?

利用SQL语句如何获得两个日期之间相差的天数

利用SQL语句如何获得两个日期之间相差的天数

如何多条SQL语句执行?

sql 时间计算,有以下一个每天的刷卡时间表,求每天上班上了多少个小时的sql 语句