SQL根据一个值组合两个记录

时间:2018-01-19 16:37:36

标签: sql

更新 - 在SQL-92中完成的工作 我在SQL报告工具中工作并尝试将两个记录合并为一个。让我们说,因为有些重复,时间被分成两个值,因此重复。基本上应该添加任何不重复的值

class FileUpload(models.Model):
    file = models.FileField(upload_to='documents', blank=True)

    def __str__(self):
        return self.file.name

class AnotherClas(models.Model):
    file_upload = models.ForeignKey('FileUpload', on_delete=models.CASCADE, blank=True)

结果

wo---text---time---value 
1----test---5------1
1----test---2------a
3----aaaa---3------1
4----bbbb---4------2

我试过了: 选择 .... 从....

GROUP BY wo SUM(时间)但是甚至没有工作。

2 个答案:

答案 0 :(得分:1)

设置:

create table so48345659a
(
    wo     integer,
    text   varchar(4),
    time   integer,
    value  varchar(2)
);

create table so48345659b
(
    wo     integer,
    text   varchar(4),
    time   integer,
    value  varchar(2)
);

insert into so48345659a (wo, text, time, value) values (1, 'test', 5, '1');
insert into so48345659a (wo, text, time, value) values (1, 'test', 2, 'a');
insert into so48345659a (wo, text, time, value) values (3, 'aaaa', 3, '1');
insert into so48345659a (wo, text, time, value) values (4, 'bbbb', 4, '2');

insert into so48345659b (wo, text, time, value) values (1, 'test', 7, '1a');
insert into so48345659b (wo, text, time, value) values (3, 'aaaa', 3, '1');
insert into so48345659b (wo, text, time, value) values (4, 'bbbb', 4, '2');

Union,默认情况下会删除重复项

select wo, text, time, value from so48345659a
union
select wo, text, time, value from so48345659b;

结果:

 wo | text | time | value 
----+------+------+-------
  1 | test |    7 | 1a
  1 | test |    2 | a
  3 | aaaa |    3 | 1
  1 | test |    5 | 1
  4 | bbbb |    4 | 2
(5 rows)

所以现在在联盟上运行总和

select
    wo,
    sum(time) as total_time
from
    (
        select wo, text, time, value from so48345659a
        union
        select wo, text, time, value from so48345659b
    ) x
group by
    wo;

结果:

 wo | total_time 
----+------------
  3 |          3
  1 |         14
  4 |          4
(3 rows)

根据你的补充质询(2017年1月22日),我猜你的意思是你有一个包含重复行的表。是吗?

如果是这样,它可能如下所示:

select * from so48345659c;
 wo | text | time | value 
----+------+------+-------
  1 | test |    5 | 1
  1 | test |    2 | a
  3 | aaaa |    3 | 1
  4 | bbbb |    4 | 2
  1 | test |    7 | 1a
  3 | aaaa |    3 | 1
  4 | bbbb |    4 | 2
(7 rows)

那么你就得到了时间的总和,忽略了重复的行,如下所示:

select
    wo,
    sum(time) as total_time
from
    (
        select distinct wo, text, time, value from so48345659c
    ) x
group by
    wo;

 wo | total_time 
----+------------
  3 |          3
  1 |         14
  4 |          4
(3 rows)

答案 1 :(得分:0)

只需两个值即可:

select wo, text, sum(time) as time, concat(min(value), max(value)) as value
from t
group by wo, text;

这使用1的标准表示形式的值小于a这一事实。

大多数数据库支持某种字符串聚合(group_concat()listagg()string_agg()是典型函数)。您可以使用其中一种方法获得更通用的解决方案。