Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2009, 17:41   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию суммирование столбцов в запросе с union

У меня есть такой
Код:
select case x.n when 2 then d1
when 2 then d2
else d3
 end d,
idobject,
data,
case x.n when 1 then 1
when 2 then 2
else 3 end hours
from mytable
inner join (select 1 n union all select 2 union all select 3) 
x on 1=1
where DATA='01.05.2009' 
and idobject='Object1' 
or idobject='Object2' 
and DATA='20.05.2009'
в результате которого получается таблица
d____idobject__data________hour
7.5___Object1__01.05.2009____1
10____Object1__01.05.2009____2
7.5___Object1__01.05.2009____3
850___Object2__01.05.2009____1
850___Object2__01.05.2009____2
850___Object2__01.05.2009____3
как можно суммировать столбцы d, чтобы получилась такая таблица:
d____idobject__data________hour
857.5___Object__01.05.2009____1
860____Object__01.05.2009_____2
857.5___Object__01.05.2009___3
как я понимаю, нужен еще один union? Помогите, пожалуйста, кто может.
kate158 вне форума Ответить с цитированием
Старый 20.05.2009, 19:03   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

1) не очень понятно зачем второй кейс если он делает передачу поля один в один
2) есть некие сомнения в правильности накладывания условий фильтра
Код:
DATA='01.05.2009' ... and DATA='20.05.2009'
отсюда - может лучше ваще переделать запрос?! условие задачи в студию

но даже из того что есть можно получить что нужно
Код:
select
  sum(a.d) d,
  a.data, 
  'Object' idobject,
  a.hours
from(
select 
  case x.n 
    when 2 then d1
    when 2 then d2
    else d3
  end d,
  idobject,
  data,
  case x.n when 1 then 1
    when 2 then 2
    else 3 
  end hours
from mytable inner join (select 1 n union all select 2 union all select 3) x on 1=1
where DATA='01.05.2009' 
   and idobject='Object1' 
   or idobject='Object2' 
   and DATA='20.05.2009') a
group by a.data, a.hours
soleil@mmc вне форума Ответить с цитированием
Старый 21.05.2009, 09:20   #3
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

пока не получается сложить, т.к. числа варчаровские.
пытаюсь переводить в строке
Код:
when 1 then d1
    when 2 then d2
    else d3
таким образом
Код:
    when 1 then (cast (d1  as float))
    when 2 then cast(d2 as float)
    else cast(d3 as float)

Последний раз редактировалось kate158; 21.05.2009 в 10:44.
kate158 вне форума Ответить с цитированием
Старый 21.05.2009, 10:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
    when 2 then (cast (d1  as float))
    when 2 then cast(d2 as float)
так почему у Вас два раза ДВОЙКА ???!?!? Это неправильно!

а по сути Ваше приведение типов работает?
если да, можете попробовать так (это фактически вариант, предложенный уважаемым soleil@mmc, просто чуть по другому записаннный:
Код:
select sum(cast (d  as float)) as d,
  a.data, 
  'Object' as idobject,
  a.hours
from (
  select 
  case x.n when 1 then d1
when 2 then d2
else d3
 end d,
idobject,
data,
case x.n when 1 then 1
when 2 then 2
else 3 end hours
from mytable
inner join (select 1 n union all select 2 union all select 3) 
x on 1=1
where DATA='01.05.2009' 
and idobject='Object1' 
or idobject='Object2' 
and DATA='20.05.2009')
group by data, hours
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2009, 11:32   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

для полноты картины тогда и условия еще подравлю,а то вообще подозрительно, что запрос что-то выдает
Код:
select sum(cast (d  as float)) d,
  data, 
  'Object' as idobject,
  hours
from (
  select 
    case x.n 
      when 1 then d1
      when 2 then d2
      else d3
    end d,
    idobject,
    data,
    x.n hours
  from mytable
         inner join (select 1 n from ??? union all select 2 from ???? union all select 3 from ???) x on 1=1
  where (DATA='01.05.2009' or DATA='20.05.2009')
     and (idobject='Object1' or idobject='Object2'))
group by data, hours
а из чего берется селект для ваших фейковых строчек по 3м часам, который обозначен псевдонимом Х? я там знаки вопросов поставил
и второй кейс упростил - лишнюю работу делает раз набор данных (в 3 строки) строго задан

З.Ы.: а ваще-то передавайте превед проектировщику вашей базы (с чего он решил, что числами в виде строки легче оперировать чем просто числами?!)

Последний раз редактировалось soleil@mmc; 21.05.2009 в 11:48.
soleil@mmc вне форума Ответить с цитированием
Старый 21.05.2009, 11:59   #6
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
а из чего берется селект для ваших фейковых строчек по 3м часам, который обозначен псевдонимом Х
если помните мою тему 'транспонирование строки в столбец', то это таблица secondtable
Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
передавайте превед проектировщику вашей базы
передаю уже вторую неделю)) постоянно вылетает какая нить ерунда
kate158 вне форума Ответить с цитированием
Старый 21.05.2009, 12:28   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от kate158 Посмотреть сообщение
если помните мою тему 'транспонирование строки в столбец', то это таблица secondtable

передаю уже вторую неделю)) постоянно вылетает какая нить ерунда
веселая табличка конечно
а если вам понадобится записывать показания не каждый час, а каждые полчаса? а 15 минут, а каждую минуту? про секунды даже страшно подумать
это ж сколько колонок по мнениею вашего гуру нужно насоздавать в табличку...
soleil@mmc вне форума Ответить с цитированием
Старый 21.05.2009, 13:41   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
для полноты картины тогда и условия еще подравлю
оп-с!
то, что в исходном запросе условия неверно заданы, это факт! (я это проглядел )
но, мне кажется, что Катя хотела получить все записи
с Object1 от 1.05.2009
или
с Object2 от 20.05.2009

тогда условие правильно так:
Код:
where (DATA='01.05.2009' and idobject='Object1')
  or (DATA='20.05.2009' and idobject='Object2')
p.s. Катя, а можно Вас попросить сменить Ваш origin (подпись) на что-нибудь менее кровожадное?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2009, 14:18   #9
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я это проглядел
в принципе не так важно, запрос постоянно меняется, а эта часть как тест. но, конечно, Вы правы.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
можно Вас попросить сменить Ваш origin (подпись) на что-нибудь менее кровожадное?..
попросить можно. =)
kate158 вне форума Ответить с цитированием
Старый 21.05.2009, 14:49   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от kate158 Посмотреть сообщение
в принципе не так важно, запрос постоянно меняется, а эта часть как тест. но, конечно, Вы правы.
попросить можно. =)
выходит, что в моем случае тестовый набор шире
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двухмерный массив из 20 столбцов. Вставить в него столбец из чисел 10 после всех четных столбцов. Дмитрий142 Помощь студентам 9 07.06.2012 19:32
Как подсунуть параметр в Query после Union? Корчеватель Паскаль, Turbo Pascal, PascalABC.NET 0 18.05.2009 21:58
ошибка в запросе с union Tanuska___:) БД в Delphi 3 22.08.2008 22:32
UNION - подскажите Yurk@ БД в Delphi 1 06.08.2008 09:18
Union NeiL Общие вопросы C/C++ 1 30.05.2008 23:45