我有两个应该合并在一起的查询。这是我的查询1:
SELECT
t1.rec_id,
t1.category,
t1.name,
t1.code,
CASE
WHEN t1.name= 'A' THEN SUM(t1.amount)
WHEN t1.name = 'D' THEN SUM(t1.amount)
WHEN t1.name = 'H' THEN SUM(t1.amount)
WHEN t1.name = 'J' THEN SUM(t1.amount)
END AS Amount
FROM Table1 t1
GROUP BY t1.name, t1.rec_id, t1.category, t1.code
查询1产生以下结果集:
Rec ID Category Name Code Amount
1 1 A MIX 70927.00
1 3 D MIX 19922.00
1 2 H MIX 55104.00
1 4 J MIX 76938.00
然后我有查询2:
SELECT
CASE
WHEN t2.category_id = 1 THEN SUM(t2.sum)
WHEN t2.category_id = 2 THEN SUM(t2.sum)
WHEN t2.category_id = 3 THEN SUM(t2.sum)
WHEN t2.category_id = 4 THEN SUM(t2.sum)
END AS TotalSum
FROM Table2 t2
INNER JOIN Table1 t1
ON t1.amnt_id = t2.amnt_id
AND t2.unique_id = @unique_id
GROUP BY t2.category_id
查询2的结果集是这样:
TotalSum
186013.00
47875.00
12136.00
974602.00
我需要的是将查询1和查询2结合在一起的结果集:
Rec ID Category Name Code Amount TotalSum
1 1 A MIX 70927.00 186013.00
1 3 D MIX 19922.00 47875.00
1 2 H MIX 55104.00 12136.00
1 4 J MIX 76938.00 974602.00
您会看到table 1
和table 2
之间存在联系。该连接为amnt_id
。但是,我尝试对查询1执行LEFT INNER JOIN
,然后仅对case statement
使用相同的逻辑来获得表2的总和。不幸的是,我使用的Sybase版本不支持Left Inner Join。我想知道是否还有其他方式可以连接这两个查询?谢谢
答案 0 :(得分:1)
我想知道CASE语句在第一个查询中是否有意义,因为它累加每一行。除A,D,H,J之外,名称列还有其他值吗?如果没有,您可以将CASE语句更改为SUM(t1.amount) AS Amount
。同样,在第一个查询中,GROUP BY在我看来也很可疑:您正在按记录ID列进行分组-这意味着您根本就不在分组,而是返回每一行。如果那是您真正想要的,则可以完全省略SUM,而只返回 pure 数量列。
据我了解,您的问题和数据结构:表2中的值是类别总和,表1中的值是子集。您想查看表1中每个类别的类别总和吗?
您通常会使用CTE(公用表表达式,“ WITH子句”),但是ASE不支持CTE,因此我们必须使用联接。我在SQL Anywhere数据库中重新创建了表,并将此示例放在一起。简而言之:两个查询都是外部查询中的子查询,并且在类别ID上保持联接:
SELECT *
FROM
(
SELECT
t1.rec_id,
t1.category,
t1.name,
t1.code,
CASE
WHEN t1.name= 'A' THEN SUM(t1.amount)
WHEN t1.name = 'D' THEN SUM(t1.amount)
WHEN t1.name = 'H' THEN SUM(t1.amount)
WHEN t1.name = 'J' THEN SUM(t1.amount)
END AS Amount
FROM Table1 t1
GROUP BY t1.rec_id, t1.name, t1.category, t1.code
) AS t1
LEFT JOIN
(
SELECT category_id, SUM(sum) FROM
table2
GROUP BY category_id
) AS totals(category_id, total_sum)
ON totals.category_id = t1.category;
此查询给我:
Rec ID Category Name Code Amount Category_id total_sum
2 3 D MIX 19922.00 3 47875.00
3 2 H MIX 55104.00 2 12136.00
1 1 A MIX 70927.00 1 186013.00
4 4 J MIX 76938.00 4 974602.00
您肯定必须对其进行一些调整,包括您的 t2.unique_id 列(我从您的查询中无法理解),但这是解决ASE缺少CTE功能的一种实用方法。 / p>
顺便说一句:它是INNER JOIN
(仅来自两个表的对应记录)或LEFT (OUTER) JOIN
(均从左侧,仅来自右表的对应记录),但为{{1} }没有道理。