powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Суммирование таблиц - задачка по SQL
25 сообщений из 39, страница 1 из 2
Суммирование таблиц - задачка по SQL
    #33100851
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вниманию SQL-гуру предлагается недавно встретившаяся в жизни задачка.
Дано 2 таблицы
create table t1 (col1 int, col2 int, primary key col1);
create table t2 (col1 int, col2 int, primary key col1);

insert into t1 (1, 1);
insert into t1 (1, 2);
insert into t1 (2, 2);

insert into t2 (2, 2);
insert into t2 (3, 1);

Требуется : получить таблицу t3, состоящую из всех встреченных ключей и сумм по этим ключам. Т.е. результат должен быть
col1 sum(col2)
1 3
2 4
3 1


Чем универсальней (в плане СУБД) тем лучше.
Свое решение опубликую позже.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33100855
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый взгляд ничего, кроме GROUP BY по UNION, не требуется. В чем подвох ?
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33100857
Rollo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще интересно что за primary key такой если можно несколько одинаковых значений в таблицу t1 внести. какая-то неудачная задачка
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33100861
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rolloчто за primary key такой если можно несколько одинаковых значений в таблицу t1 внести.Угу... Существенное замечание.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33100906
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде ChA все уже сказал. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE #t1 (col1 INT, col2 INT)
CREATE TABLE #t2 (col1 INT, col2 INT)

INSERT INTO #t1 VALUES ( 1 ,  1 )
INSERT INTO #t1 VALUES ( 1 ,  2 )
INSERT INTO #t1 VALUES ( 2 ,  2 )

INSERT INTO #t2 VALUES ( 2 ,  2 )
INSERT INTO #t2 VALUES ( 3 ,  1 )

SELECT Col1, SUM(col2) AS SuMcol2
FROM
(
  SELECT 
   *
  FROM 
    #t1
  UNION ALL
  SELECT 
   *
  FROM 
    #t2
) t
GROUP BY Col1

DROP TABLE #t1
DROP TABLE #t2
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33100990
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Задачка действительно нетрудная. Я бы сказал рутинная.
mir сделал селектом по селекту, но это непринципиально. Если конкретный сервер этого не поддерживает, то всегда можно сделать через временные таблицы.

А в моем варианте буковок больше!
Код: plaintext
1.
2.
3.
select isNull(#t1.col1,#t2.col1), isNull(sum(#t1.col2), 0 )+isNull(sum(#t2.col2), 0 ) 
from #t1 full outer join #t2 on #t1.col1=#t2.col1
group by isNull(#t1.col1,#t2.col1)
=============
Однако по теме форума. Таких одинаковых таблиц в базе быть не должно. Чем они отличаются?

Названием? Если это данные разных операций, то лучше ввести еще одно поле - признак операции

table t (
Operation int,
col1 int,
col2 int
)
==================
Уважаемы господа! Время от времени у всех нас получаются интересные запросы.
Может быть стоит завести топик - "Золотая коллекция запросов"? Не задачки задавать, а просто делится опытом. У меня сечас как-раз есть один забавный SELECT.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33101692
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?

PS: В условии неточность - конечно,col1 не primary key и даже не unique.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33101756
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegalloselect from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?Баз = СУБД ? Так view-то на UNION ALL что мешает сделать, это-то практически все СУБД понимают ? А потом выборка из него с группировкой, полагаю, что это самый практичный вариант. Наверняка, вариант, который Вы можете предложить, будет намного дороже в смысле выполнения сервером.
Можно такой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT col1, SUM(col2) + (SELECT SUM(t2.col2) FROM t2 WHERE t2.col1 = t1.col1)
FROM t1
GROUP BY col1
UNION
SELECT col1, SUM(col2) + (SELECT SUM(t1.col2) FROM t1 WHERE t1.col1 = t2.col1)
FROM t2
GROUP BY col1
Или есть СУБД, которые не знают UNION ?

P.S. Чесслово, суть вопроса понятней не стала, точнее даже, смысл универсальности. Наверняка, за счет вопиющей неоптимальности...
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33101792
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA vybegalloselect from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?Баз = СУБД ? Так view-то на UNION ALL что мешает сделать, это-то практически все СУБД понимают ? А потом выборка из него с группировкой, полагаю, что это самый практичный вариант. Наверняка, вариант, который Вы можете предложить, будет намного дороже в смысле выполнения сервером.
Можно такой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT col1, SUM(col2) + (SELECT SUM(t2.col2) FROM t2 WHERE t2.col1 = t1.col1)
FROM t1
GROUP BY col1
UNION
SELECT col1, SUM(col2) + (SELECT SUM(t1.col2) FROM t1 WHERE t1.col1 = t2.col1)
FROM t2
GROUP BY col1
Или есть СУБД, которые не знают UNION ?

P.S. Чесслово, суть вопроса понятней не стала, точнее даже, смысл универсальности. Наверняка, за счет вопиющей неоптимальности...

1> SELECT col1, SUM(col2) + (SELECT SUM(t2.col2) FROM t2 WHERE t2.col1 = t1.col1)
FROM t1
2> 3> ;
Msg 21, Level 14, State 0:
ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN,
and EXISTS Subquery SELECT/UNION at line: 1,
-- (df_Heap.cxx 4753)

Sybase IQ er 12.5

Try again...
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33101794
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.
Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33101976
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.
Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате.Тоже кстати... Тот факт, что СУБД хранит таблицы по столбцам, вовсе не обязательно влечет какую-то особенную зависимость цены выборки от числа столбцов в результате.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33102076
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
select isnull(#t1.col1, #t2.col1), isnull(sum(#t1.col2),  0 ) + isnull(sum(#t2.col2),  0 )
from #t1
  full outer join #t2 on
     1  =  0 
group by isnull(#t1.col1, #t2.col1)
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33102308
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторMsg 21, Level 14, State 0:
ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN,
and EXISTS Subquery SELECT/UNION at line: 1,
-- (df_Heap.cxx 4753)

ASA отлично справится с запросом, предложенным mir
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33102576
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 daw
Респект. Я сходу до этого не допер.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33102632
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
vybegalloPRIMARY KEY(col1, col2) ?
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103660
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
daw
Код: plaintext
1.
2.
3.
4.
select isnull(#t1.col1, #t2.col1), isnull(sum(#t1.col2),  0 ) + isnull(sum(#t2.col2),  0 )
from #t1
  full outer join #t2 on
     1  =  0 
group by isnull(#t1.col1, #t2.col1)


$ ./myisql
1> select isnull(t1.col1, t2.col1), isnull(sum(t1.col2), 0) + isnull(sum(t2.col2), 0)
from t1
full outer join t2 on
1 = 0
group by isnull(t1.col1, t2.col1)
;
isnull(t1.col1,t2.col1) isnull(sum(t1.col2),0)+isnull(
----------------------- ------------------------------

(0 rows affected)

НО если переделать JOIN на
t1.col1 = t2.col1
то все работает :

1> select isnull(t1.col1, t2.col1), isnull(sum(t1.col2), 0) + isnull(sum(t2.col2), 0)
from t1
full outer join t2 on
t1.col1 = t2.col1
group by isnull(t1.col1, t2.col1)
isnull(t1.col1,t2.col1) isnull(sum(t1.col2),0)+isnull(
----------------------- ------------------------------
2 4
1 3
3 1

(3 rows affected)


Ну и по поводу цены выборки в СУБД с постолбцовым расположением данных.
Дано :
таблица из 2 колонок, 1M записей, каждая колонка 100 байт.
Требуется : определить X1 - число прочитанных с диска байт для
случая select col1 from t1
и X2 - для случая select col1, col2 from t1.

Бонус и премия Филдса уходят тому, кто докажет X1 = X2
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103665
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri авторMsg 21, Level 14, State 0:
ASA Error -1005004: Subqueries are allowed only as arguments of comparisons, IN,
and EXISTS Subquery SELECT/UNION at line: 1,
-- (df_Heap.cxx 4753)

ASA отлично справится с запросом, предложенным mir

А IQ ни асилил...
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103738
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.Ваше право, но Вы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. Или Вы уверены, что Ваш запрос будет одинаково оптимален для всех ? С нетерпением ожидаю его опубликования...
vybegalloКакой ответ будет на вопрос ?
Кстати, Ваша модификация варианта-daw на t1.col1 = t2.col1 фактически приводит его к варианту-Cat2 , что может привести к неправильному ответу при других исходных данных. Надеюсь, понятно при каких ? Тем не менее, вариант-daw вполне рабочий и, с теоретической точки зрения, абсолютно верный для всех СУБД, правильно понимающих FULL JOIN, но MySQL(?) просто неправильно его обрабатывает. Т.е., надо еще учитывать, что некоторые СУБД могут не только не понимать синтаксис запроса, но и просто неверно его выполнять ? :)

P.S. daw, прекрасный вариант ! К сожалению, исключил для себя FULL JOIN, так как точно встречался с СУБД, который просто не знали что это такое :) Например, Informix 7.xx. Кстати, он же не понимал и подзапросов в пункте FROM(вариант-mir)...
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103755
vybegallo03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ok, мой вариант (при замене case на isnull сводится к уже описанному) :
select
case when t1.col1 is null then t2.col1 else t1.col1 end col1,
sum (case when col2 is null then t2.col2
when t2.col2 is null then col2
else col2 + t2.col2 end) col2,
from t1 full outer join t2 on(t1.col1 = t2.col1)
group by case when t1.col1 is null then t2.col1 else t1.col1 end;

Так на каких данных он будет давать неправильные результаты ?

А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103788
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных.
Дано :
таблица из 2 колонок, 1M записей, каждая колонка 100 байт.
Требуется : определить X1 - число прочитанных с диска байт для
случая select col1 from t1
и X2 - для случая select col1, col2 from t1.
Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2?
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33103975
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegallo03
Так на каких данных он будет давать неправильные результаты ?


ну, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert into t1 ( 1 ,  1 );
insert into t1 ( 1 ,  2 );
insert into t1 ( 2 ,  2 );

insert into t2 ( 2 ,  2 );
insert into t2 ( 2 ,  3 );
insert into t2 ( 3 ,  1 );
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33104634
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vybegallo03Так на каких данных он будет давать неправильные результаты ?Это же очевидно, см. пример daw...

vybegallo03А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения.Простите, но Вы невнимательны ChAВы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. При чем здесь оптимальность только для Sybase IQ 12.5 ? Для другого сервера он может оказатся неоптимальным, или, по крайней мере, вариант с UNION ALL и GROUP BY может оказатся на них более оптимальным. Вам был предложен вариант, который выполнялся бы практически на всех вменяемых СУБД и с высокой степенью оптимальности. Это view на UNION ALL и группировка по нему.

P.S.Тоже имею слабость решать некоторые задачи одним универсальным запросом, но всегда отдаю себе отчет, что оптимальность при этом может сильно пострадать...
P.P.S. А на вопрос в очередной раз так и не ответили...
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33106009
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mir vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных.
Дано :
таблица из 2 колонок, 1M записей, каждая колонка 100 байт.
Требуется : определить X1 - число прочитанных с диска байт для
случая select col1 from t1
и X2 - для случая select col1, col2 from t1.
Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2?

Представьте себе - да.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33106017
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA vybegallo03Так на каких данных он будет давать неправильные результаты ?Это же очевидно, см. пример daw...

vybegallo03А насчет оптимальности - как только вы предложите запрос с Union, понимаемый Sybase IQ 12.5 - так сразу я его протестирую и выложу результаты и даже планы выполнения.Простите, но Вы невнимательны ChAВы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. При чем здесь оптимальность только для Sybase IQ 12.5 ? Для другого сервера он может оказатся неоптимальным, или, по крайней мере, вариант с UNION ALL и GROUP BY может оказатся на них более оптимальным. Вам был предложен вариант, который выполнялся бы практически на всех вменяемых СУБД и с высокой степенью оптимальности. Это view на UNION ALL и группировка по нему.

P.S.Тоже имею слабость решать некоторые задачи одним универсальным запросом, но всегда отдаю себе отчет, что оптимальность при этом может сильно пострадать...
P.P.S. А на вопрос в очередной раз так и не ответили...

Прежде чем обсуждать оптимальность, желательно написать запрос, не выдающий синтаксических ошибок.
Ну такая уж у меня попалась невменяемая СУБД, что select from (select) не понимает. Не она одна такая непонятливая, кстати - и Informix 7, и DB2 7.1 (насчет 8 не помню) тоже не понимают таких вариантов.
...
Рейтинг: 0 / 0
Суммирование таблиц - задачка по SQL
    #33106019
vybegallo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что за вопрос-то ? Нету там PK, ни col1, ни col, col2.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Суммирование таблиц - задачка по SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]