Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Итоговая сумма, кроме текущего месяца


Автор: MoLeX 28.12.2009, 13:30
Привет.
Не могу составить SQL запрос суммирующий общую сумму (поле sum) за все года, кроме текущего года и месяца

Код

CREATE TABLE IF NOT EXISTS `table` (
  `id` int(11) NOT NULL auto_increment,
  `index` int(11) NOT NULL default '0',
  `sum` float(10,2) NOT NULL,
  `year` int(4) NOT NULL,
  `month` int(2) NOT NULL
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

Автор: DimW 28.12.2009, 13:44
Код

select sum(`sum`)
  from table
 where `month` != 12
   and `year` != 2009

Автор: Gudinya 28.12.2009, 13:54
DimW
Сомневаюсь что это пройдет ;) советую проверить, а пока вариант от меня

Код

Select * From table t
Where `month` || `year` != '122009'


Автор: Deniz 28.12.2009, 14:04
Gudinyaне вижу принципиальной разницы. увидел.

Автор: DimW 28.12.2009, 14:05
Цитата(Gudinya @  28.12.2009,  13:54 Найти цитируемый пост)
советую проверить

в чем собственно сомнения?

Автор: Akina 28.12.2009, 14:12
Код

WHERE `month` != DateFormat(NOW(), '%c')
   and `year` != DateFormat(NOW(), '%Y')


Добавлено через 37 секунд
Но вообще хранить год и месяц по отдельности... мсье знает толк в извращениях...

Автор: Gudinya 28.12.2009, 14:17
Для тех кто не видит разницы
вот пища для размышления
Код

With cur as (
  select 1 d, 1 m from dual
  Union all
  select 2, 1 from dual
  Union all
  select 3, 1 from dual
  Union all
  select 4, 1 from dual
  Union all
  select 5, 1 from dual
  Union all
  select 1, 2 from dual)
Select count(*) from cur c
Where c.d != 1
  and c.m != 2

и
Код

With cur as (
  select 1 d, 1 m from dual
  Union all
  select 2, 1 from dual
  Union all
  select 3, 1 from dual
  Union all
  select 4, 1 from dual
  Union all
  select 5, 1 from dual
  Union all
  select 1, 2 from dual)
Select count(*) from cur c
Where c.d || c.m != '12'


еподсказка, вы исключаете только декабрь 2009 гда или всех годов ?

Автор: MoLeX 28.12.2009, 14:22
Akina, знаю что извращение, но это требование  smile

Добавлено через 4 минуты и 54 секунды
Gudinya, только вот так:
Код

(`month` != '12' || `year` != '2009')


Добавлено через 5 минут и 2 секунды
всем спасибо, решил

Автор: Gudinya 28.12.2009, 14:44
Цитата(MoLeX @  28.12.2009,  14:22 Найти цитируемый пост)
(`month` != '12' || `year` != '2009')

с таким синтаксисом не знаком, потому ничего сказать не могу, но смысл в том что выборка
Код

where `month` != 12  and `year` != 2009


привела бы к исключению ВСЕХ декабрей из перечисленной таблицы, а не только 2009

 smile люди, не нужно сразу обвинять автора поста меня или еще кого либо в том что он не прав, если уж собрались специалисты, то давайте приводить по возможности примеры того что человек заблуждается, а абстрактное ты не прав уж очень похоже на такой же как и этот  smile smile 

Автор: Deniz 28.12.2009, 14:49
Цитата(Gudinya @  28.12.2009,  17:44 Найти цитируемый пост)
привела бы к исключению ВСЕХ декабрей из перечисленной таблицы, а не только 2009
я бы даже сказал всех декабрей и всего 2009 года. Вместо and в том примере нужно поставить or, что и сделал MoLeX.
 smile 
Gudinya, не надо так реагировать у всех бывает

Автор: DimW 28.12.2009, 15:02
Цитата(Deniz @  28.12.2009,  14:49 Найти цитируемый пост)
я бы даже сказал всех декабрей и всего 2009 года. Вместо and в том примере нужно поставить or

я бы предложил это:
Код

With cur as (
  select 1 d, 1 m from dual
  Union all
  select 2, 1 from dual
  Union all
  select 3, 1 from dual
  Union all
  select 4, 1 from dual
  Union all
  select 5, 1 from dual
  Union all
  select 1, 2 from dual)
  
Select * from cur c
Where not(c.d  = 1 and c.m = 2)


старемная фигня, пока не нашел как это матиматически представляется, имею ввиду свой вариант. 

Цитата(Gudinya @  28.12.2009,  14:44 Найти цитируемый пост)
не нужно сразу обвинять

спокойно, ни кто еще ни кого обвенить не успел.

Автор: DimW 28.12.2009, 15:20
Цитата(DimW @  28.12.2009,  15:02 Найти цитируемый пост)
пока не нашел как это матиматически представляется

нашел:
отрицание(A коньюнкция B) = отрицание A дизьюнкция отрицание B
т.е. условие c.d  != 1 or c.m != 2 для этой задичи подходит, как и  not(c.d  = 1 and c.m = 2)


Gudinya, а про конкитенацию в булевой алгебре ни слова - http://ru.wikipedia.org/wiki/%D0%91%D1%83%D0%BB%D0%B5%D0%B2%D0%B0_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0

раз уж речь о профессиональности пошла...  smile 

Автор: Gudinya 28.12.2009, 15:37
 smile 
Я ни к кому конкретно не обращался, обвинения могут быть прямые и косвенные.

Цитата(DimW @  28.12.2009,  15:20 Найти цитируемый пост)
а про конкитенацию в булевой алгебре не слова

)) улыбнул, получу наверное ошибку Error: You select contains сoncatenation in where case
т.е. приведение к дате и сравнение дат ты бы тоже искал в булевой алгебре?

Автор: Gudinya 28.12.2009, 15:57

 smile напоследок
Извиняюсь если зацепил чувство кого либо
просто сын приболел чуть чуть и всю ночь не спал, ну и я с ним по этому желчь так и льётся smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)