如何在PostgreSQL中联接2个表而没有值重复

时间:2018-07-30 13:27:37

标签: postgresql duplicates jointable

我正在使用以下方法联接两个表:

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

2 个答案:

答案 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)

SQL DEMO

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 |