Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Суммирование таблиц - задачка по SQL / 25 сообщений из 39, страница 1 из 2
03.06.2005, 23:56
    #33100851
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Вниманию 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
04.06.2005, 00:11
    #33100855
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
На первый взгляд ничего, кроме GROUP BY по UNION, не требуется. В чем подвох ?
...
Рейтинг: 0 / 0
04.06.2005, 00:16
    #33100857
Rollo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
еще интересно что за primary key такой если можно несколько одинаковых значений в таблицу t1 внести. какая-то неудачная задачка
...
Рейтинг: 0 / 0
04.06.2005, 00:36
    #33100861
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Rolloчто за primary key такой если можно несколько одинаковых значений в таблицу t1 внести.Угу... Существенное замечание.
...
Рейтинг: 0 / 0
04.06.2005, 09:14
    #33100906
mir
mir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Вроде 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
04.06.2005, 13:12
    #33100990
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Задачка действительно нетрудная. Я бы сказал рутинная.
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
05.06.2005, 23:05
    #33101692
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
select from (select..) не понимает уйма баз. И хотелось бы обойтись без временных таблиц. Anyone ?

PS: В условии неточность - конечно,col1 не primary key и даже не unique.
...
Рейтинг: 0 / 0
06.06.2005, 01:57
    #33101756
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
06.06.2005, 03:30
    #33101792
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
06.06.2005, 03:35
    #33101794
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Кстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.
Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате.
...
Рейтинг: 0 / 0
06.06.2005, 09:36
    #33101976
mir
mir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.
Например, нынче я работаю с такой экзотической вещью как Sybase IQ, которая хранит таблицы по столбцам. В результате чего все понятия об оптимизации становятся с ног на голову. К примеру, приходится избавляться от view вида SELECT * ..., потому что цена выборки зависит от числа столбцов в результате.Тоже кстати... Тот факт, что СУБД хранит таблицы по столбцам, вовсе не обязательно влечет какую-то особенную зависимость цены выборки от числа столбцов в результате.
...
Рейтинг: 0 / 0
06.06.2005, 10:32
    #33102076
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
Код: 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
06.06.2005, 12:09
    #33102308
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
автор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
06.06.2005, 13:51
    #33102576
mir
mir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
2 daw
Респект. Я сходу до этого не допер.
...
Рейтинг: 0 / 0
06.06.2005, 14:17
    #33102632
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
vybegalloPRIMARY KEY(col1, col2) ?
...
Рейтинг: 0 / 0
06.06.2005, 22:54
    #33103660
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
06.06.2005, 23:06
    #33103665
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
07.06.2005, 02:05
    #33103738
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
vybegalloКстати, я бы поострегся делать выводы об оптимальности-неоптимальности запросов без привязки к конкретной СУБД.Ваше право, но Вы-то пытаетесь решить единым запросом на большинстве СУБД, а не на одной конкретной. Или Вы уверены, что Ваш запрос будет одинаково оптимален для всех ? С нетерпением ожидаю его опубликования...
vybegalloКакой ответ будет на вопрос ?
Кстати, Ваша модификация варианта-daw на t1.col1 = t2.col1 фактически приводит его к варианту-Cat2 , что может привести к неправильному ответу при других исходных данных. Надеюсь, понятно при каких ? Тем не менее, вариант-daw вполне рабочий и, с теоретической точки зрения, абсолютно верный для всех СУБД, правильно понимающих FULL JOIN, но MySQL(?) просто неправильно его обрабатывает. Т.е., надо еще учитывать, что некоторые СУБД могут не только не понимать синтаксис запроса, но и просто неверно его выполнять ? :)

P.S. daw, прекрасный вариант ! К сожалению, исключил для себя FULL JOIN, так как точно встречался с СУБД, который просто не знали что это такое :) Например, Informix 7.xx. Кстати, он же не понимал и подзапросов в пункте FROM(вариант-mir)...
...
Рейтинг: 0 / 0
07.06.2005, 04:20
    #33103755
vybegallo03
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
07.06.2005, 06:37
    #33103788
mir
mir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных.
Дано :
таблица из 2 колонок, 1M записей, каждая колонка 100 байт.
Требуется : определить X1 - число прочитанных с диска байт для
случая select col1 from t1
и X2 - для случая select col1, col2 from t1.
Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2?
...
Рейтинг: 0 / 0
07.06.2005, 09:49
    #33103975
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
07.06.2005, 12:48
    #33104634
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
07.06.2005, 21:03
    #33106009
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
mir vybegalloНу и по поводу цены выборки в СУБД с постолбцовым расположением данных.
Дано :
таблица из 2 колонок, 1M записей, каждая колонка 100 байт.
Требуется : определить X1 - число прочитанных с диска байт для
случая select col1 from t1
и X2 - для случая select col1, col2 from t1.
Бонус и премия Филдса уходят тому, кто докажет X1 = X2А при чем здесь постолбцовое хранение? Или вы считаете, что для построчного хранения X1 = X2?

Представьте себе - да.
...
Рейтинг: 0 / 0
07.06.2005, 21:18
    #33106017
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
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
07.06.2005, 21:19
    #33106019
vybegallo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Суммирование таблиц - задачка по SQL
А что за вопрос-то ? Нету там PK, ни col1, ни col, col2.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Суммирование таблиц - задачка по SQL / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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