没有临时表的SQL连接

时间:2015-07-22 18:22:49

标签: sql oracle plsql oracle11g

长话短说,我有两个单独的查询,我希望将它们组合成一个更好看的问题。我之前用CTE完成了这个,但是我需要使用SSIS&05; 05它不支持CTE或临时表 - 我不能为我的生活找出怎么做没有他们。

就像我说的,我有两个单独的选择'声明。一个用于第一次平均值,另一个用于后续平均值。第一个输出类似于:

Description            First_Averages
a) xxx                 4.533333
b) xxx                 8.238095
c) xxx                 .5
I) xxx                 2
j) xxx                 2.25

和我的第二个'选择'声明的输出看起来非常相似:

Description            Subsequent_Averages
a) xxx                 4.225806
b) xxx                 4.393939
c) xxx                 .1428571
d) xxx                 0
f) xxx                 0
j) xxx                 1.666667

使用CTE,即使值为null(将null替换为0),我也可以显示每个描述,并将它们合并为一个(更好看的)输出。我能用CTE获得的期望输出如下:

Description            First_Averages            Subsequent_Averages
a) xxx                 4.533333                  4.225806
b) xxx                 8.238095                  4.393939
c) xxx                 .5                        .1428571
d) xxx                 0                         0
e) xxx                 0                         0
f) xxx                 0                         0
g) xxx                 0                         0
h) xxx                 0                         0
i) xxx                 2                         0
j) xxx                 2.25                      1.666667

有没有办法在不使用任何类型的CTE或临时表的情况下执行此操作?

我的前两个代码'选择'陈述如下:

SELECT
description, avg(total_score)
FROM (a long select statement)
WHERE sequence_num = '1'
group by description
order by description;

第二个选择'声明的代码完全相同,除了" sequence_num =' 1'"是" sequence_num<> ' 1'"

如果您想查看FROM代码,我可以更新并包含它。它使这篇文章比现在更长,所以我把它删除了。

我无法找到显示所有描述的方法,包括那些具有空均值的描述,并将平均值加入描述,就像我对CTE一样。

提前感谢您的提示。如果您需要更多信息,请告诉我,我已经在圈子里跑了一段时间试图这样做。

3 个答案:

答案 0 :(得分:4)

尝试使用CASE表达式:

SELECT
      description, 
      avg(total_score),
      avg( CASE WHEN sequence_num = 1 THEN total_score END ),
      avg( CASE WHEN sequence_num <> 1 THEN total_score END )
FROM (a long select statement)
group by description
order by description;

答案 1 :(得分:0)

如果我理解正确,你只想加入两个平均值,并附上所有可能的描述。可以实现这一目标的一种方法是,我看到你提供的内容就是做同样的事情来获得平均值,查询你正在创建的数据集并进行连接。

例如,您可以执行以下操作:

SELECT 
    a.description
    , IFNULL(b.First_Averages,0) as First_averages
    , IFNULL(c.Subsequent_Averages,0) as Subsequent_Averages
FROM (
SELECT
description--, avg(total_score)
FROM (a long select statement)
--WHERE sequence_num = '1'
group by description
--order by description;
) a
LEFT JOIN (
SELECT
description, avg(total_score)
FROM (a long select statement)
WHERE sequence_num = '1'
group by description
--order by description;
) b
ON a.description = b.description
LEFT JOIN (
SELECT
description, avg(total_score)
FROM (a long select statement)
WHERE sequence_num <> '1'
group by description
--order by description;
) c
ON a.description = c.description
order by a.description

现在说,这可能不是最好的方法。任何时候我必须查询查询的数据集,我总是试着看看我是否可以简化我正在做的事情。

编辑以解决如何正确加入的完全缺席的心态。 (添加了ON条款)

答案 2 :(得分:0)

根据你得到的输出,我认为描述是一个独特的列。那么,为什么不full outer join描述列上的表。

select description, coalesce(first_averages,0), coalesce(subsequent_averages,0) from (
select a.*, b.subsequent_averages from
firsttable a full outer join secondtable b
on a.description=b.description)

对于那些不可用的,它将为您提供NULL。但是,coalesce函数将取整数0代替null。

用coalesce编辑。