Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединить повторяющиеся данные.  [new]
Slider_spb
Member

Откуда:
Сообщений: 802
Привет всем!
Есть табличка типа

ID A B
1 2 4
2 3 5
3 2 4
4 6 8
Нужно объединить данные с повторяющимися значениями атрибутов А и B в одну запись, просуммировав их.
В результате должно быть типа

ID A B
1 4 8
2 3 5
4 6 8
или

ID A B
2 3 5
4 6 8
5 4 8
т.е. одинаковые значения атрибутов записей с ID 1, 3 должны быть просуммированы либо в новую запись, либо в одну из них. Как это лучше реализовать можно?
6 окт 05, 15:24    [1945080]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
adv
Member

Откуда:
Сообщений: 3333
select min(Id), sum(A), sum(B) from tabl group by A, B
6 окт 05, 15:47    [1945219]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Slider_spb
Member

Откуда:
Сообщений: 802
Не, так не получиться... Вот я чего придумал:
ISERT INTO Table(A,B)
SELECT SUM(A), SUM(B) FROM Table
GROUP BY A, B
HAVING COUNT(*) > 1
Осталось только удалить повторяющиеся записи, но это уже здесь где-то было.
6 окт 05, 16:00    [1945315]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
adv
Member

Откуда:
Сообщений: 3333
автор
Не, так не получиться...
Странно, у меня получается.
Slider_spb
Вот я чего придумал:
ISERT INTO Table(A,B)
SELECT SUM(A), SUM(B) FROM Table
GROUP BY A, B
HAVING COUNT(*) > 1
Осталось только удалить повторяющиеся записи, но это уже здесь где-то было.

Чего то это не удовлетворяет вашим условиям. Отсекаются записи, встречающиеся 1 раз.
6 окт 05, 16:07    [1945350]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Taffy
Member

Откуда:
Сообщений: 20501
2 Slider_spb
А что у Вас не получилось?
Вы протестили предлагаемый вариант?
6 окт 05, 16:12    [1945375]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Slider_spb
Member

Откуда:
Сообщений: 802
А понял, вы имели ввиду результат вставить в новую таблицу, удалив старую... Тогда работает. Тоже вариант, хотя недублируемые записи все-таки хотелось не трогать.
6 окт 05, 16:16    [1945399]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Дарьюшка
Member

Откуда: Дубна
Сообщений: 21
select min(Id), sum(A), sum(B) from [TABL] group by A
БЕЗ gROUP BY ПО В
6 окт 05, 16:18    [1945424]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Taffy
Member

Откуда:
Сообщений: 20501
2 Дарьюшка - а потестить свое предложение?

2Slider_spb
А где в условии сказано что Вам нужно делать апдейт и делете живой таблицы?
Вы просили запрос - запрос и получили.
6 окт 05, 16:24    [1945478]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Дарьюшка
Member

Откуда: Дубна
Сообщений: 21
Taffy
2 Дарьюшка - а потестить свое предложение?

А это к чему к Select или к написанию предложения :-)
Select проверила вроде бы работает как надо :-)
6 окт 05, 16:28    [1945509]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Taffy
Member

Откуда:
Сообщений: 20501
declare @mt table (id int, a int, b int)
declare @t table (id int, a int, b int)

insert into @mt select  1,    2,    4
insert into @mt select  2,    3,    5
insert into @mt select  3,    2,    4
insert into @mt select  4,    6,    8
insert into @mt select  5,    6,    8

insert into @t (id,a,b)
select id = m.id, a = m.a, m.b
from @mt m inner join
       (select a, b
        from @mt
        group by a, b
        having count(*) >1 ) h on m.a = h.a and m.b = h.b

delete m
from @mt m inner join
	@t t on m.id = t.id

insert into @mt
select min(id), SUM(a),SUM(b)
from @t
group by a,b


select *
from @mt

6 окт 05, 16:29    [1945513]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Taffy
Member

Откуда:
Сообщений: 20501
2 Дарьюшка
declare @mt table (id int, a int, b int)

insert into @mt select  1,    2,    4
insert into @mt select  2,    3,    5
insert into @mt select  3,    2,    4
insert into @mt select  4,    6,    7
insert into @mt select  5,    6,    8


select min(Id), sum(A), sum(B) 
from @mt 
group by A 
6 окт 05, 16:34    [1945535]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Дарьюшка
Member

Откуда: Дубна
Сообщений: 21
2Taffy

 declare @mt table (id int, a int, b int)

insert into @mt select  1,    2,    4
insert into @mt select  2,    3,    5
insert into @mt select  3,    2,    4
insert into @mt select  4,    6,    8
insert into @mt select  5,    6,    8

select min(id), SUM(a),SUM(b)
from @mt
group by a

А это тоже самое :-)
6 окт 05, 16:37    [1945552]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Taffy
Member

Откуда:
Сообщений: 20501
?
Наши примеры разнятся в строке с id = 4 . Возьмите мой тестовый пример и гляньте на результат. :)
6 окт 05, 16:44    [1945592]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Slider_spb
Member

Откуда:
Сообщений: 802
Спасибо всем за подсказки, вот окончательный вариант, который устроил, без всяких временных таблиц:
declare @mt table (id int IDENTITY(1, 1), a int, b int)

insert into @mt select  2,    4
insert into @mt select  3,    5
insert into @mt select  2,    4
insert into @mt select  6,    8
insert into @mt select  6,    8

INSERT INTO @mt 
SELECT SUM(a), SUM(b)
FROM @mt
GROUP BY a, b
HAVING COUNT(*) > 1

DELETE FROM @mt WHERE id IN (
SELECT id FROM @mt od
WHERE EXISTS(
SELECT a, b
FROM @mt
WHERE a = od.a AND b = od.b
GROUP BY a, b
HAVING COUNT(*) > 1))

SELECT * FROM @mt
6 окт 05, 17:52    [1945980]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
ChA
Member

Откуда: Москва
Сообщений: 11124
Slider_spb
без всяких временных таблиц:

Угу
declare @mt table (id int IDENTITY(1, 1), a int, b int)
Сложно у Вас как-то, может еще помедитируете ?
6 окт 05, 18:03    [1946056]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Slider_spb
Нужно объединить данные с повторяющимися значениями атрибутов А и B в одну запись,
просуммировав их.


select min(ID), A * count(*), B * count(*)
from AB_table
group by A, B


Posted via ActualForum NNTP Server 1.3

6 окт 05, 20:29    [1946480]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Slider_spb
Осталось только удалить повторяющиеся записи, но это уже здесь где-то было.

Ага, а вместе с ними и те, которые не повторялись...
Slider_spb
Спасибо всем за подсказки, вот окончательный вариант, который устроил, без всяких
временных таблиц:


Проверяем?

declare @mt table (id int IDENTITY(1, 1), a int, b int)

insert into @mt select  2,    4
insert into @mt select  3,    5
insert into @mt select  2,    4
insert into @mt select  6,    8
insert into @mt select  6,    8
insert into @mt select  4,    8

INSERT INTO @mt
SELECT SUM(a), SUM(b)
FROM @mt
GROUP BY a, b
HAVING COUNT(*) > 1

DELETE FROM @mt WHERE id IN (
SELECT id FROM @mt od
WHERE EXISTS(
SELECT a, b
FROM @mt
WHERE a = od.a AND b = od.b
GROUP BY a, b
HAVING COUNT(*) > 1))

SELECT * FROM @mt


Posted via ActualForum NNTP Server 1.3

6 окт 05, 20:41    [1946494]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Slider_spb
Member

Откуда:
Сообщений: 802
Я такой вариант видел, на самом деле в реальной таблице есть еще один атрибут, идетнифицирующий запись, по которому такое пересечение невозможно. Например, складывать надо только B, а A есть атрибут по которому выявляются дубли.
7 окт 05, 15:15    [1948929]     Ответить | Цитировать Сообщить модератору
 Re: Объединить повторяющиеся данные.  [new]
Дарьюшка
Member

Откуда: Дубна
Сообщений: 21
Taffy
?
Наши примеры разнятся в строке с id = 4 . Возьмите мой тестовый пример и гляньте на результат. :)

Тотже что и после очень сложной функции :-)
10 окт 05, 16:34    [1954921]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить