我正在使用以下方法联接两个表:
select table1.date, table1.item, table1.qty, table2.anotherQty
from table1
INNER JOIN table2
on table1.date = table2.date
表1
date | item | qty
july1 | itemA | 20
july1 | itemB | 30
july2 | itemA | 20
表2
date | anotherQty
july1 | 200
july2 | 300
预期结果应该是:
date | item | qty | anotherQty
july1 | itemA | 20 | 200
july1 | itemB | 30 | null or 0
july2 | itemA | 20 | 300
所以当我求和(anotherQty)时,它将只有500,而不是:
date | item | qty | anotherQty
july1 | itemA | 20 | 200
july1 | itemB | 30 | 200
july2 | itemA | 20 | 300
那是200 + 200 + 300 = 700
答案 0 :(得分:0)
尝试以下代码,但要知道,只要行之间的qty值不同,您仍然会得到'anotherQty'字段分解为不同的值的情况:
ValueStateDescriptor
如果您需要它始终将每个项目/日期汇总为一行,则还需要向table1.qty中添加一个select
table1.date,
table1.item,
table1.qty,
SUM(table2.anotherQty)
from table1
INNER JOIN table2
on table1.date = table2.date
GROUP BY
table1.item,
table1.qty,
table1.date
。或者,您可以为所需的每个数量运行一个公用表表达式(SUM()
语句),将它们加到公用表表达式中,然后将这些表达式重新加入到最终的SELECT语句中。
编辑:
根据@Juan Carlos Oropeza的评论,我不确定在将WITH()
包含在查询中的同时是否可以获取500的总和,因为您必须将输出分组为日期,这将导致聚合划分为不同的行。以下查询将以显示日期为代价为您提供anotherQty的总和:
table1.date
如果需要保留日期,可以使用WINDOW函数显示总和,但是请注意,这实际上是在进行总和,并且可能会舍弃您对该查询输出所做的任何后续总和。在后处理方面:
select
table1.item,
SUM(table1.qty),
SUM(table2.anotherQty)
from table1
INNER JOIN table2
on table1.date = table2.date
GROUP BY
table1.item
答案 1 :(得分:0)
WITH T1 as (
SELECT *, ROW_NUMBER() OVER (PARTITION BY "date" ORDER BY "item") as rn
FROM Table1
), T2 as (
SELECT *, ROW_NUMBER() OVER (PARTITION BY "date" ORDER BY "anotherQty") as rn
FROM Table2
)
SELECT *
FROM t1
LEFT JOIN t2
ON t1."date" = t2."date"
AND t1.rn = t2.rn
输出
过滤所需的列,并在需要时更改顺序。
| date | item | qty | rn | date | anotherQty | rn |
|-------|-------|-----|----|--------|------------|--------|
| july1 | itemA | 20 | 1 | july1 | 200 | 1 |
| july1 | itemB | 30 | 2 | (null) | (null) | (null) |
| july2 | itemA | 20 | 1 | july2 | 300 | 1 |