你如何加入两个计算的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语句?的主要内容,如果未能解决你的问题,请参考以下文章