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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2011, 01:16   #1
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию Выбор повторяющихся значений из одной таблицы

привет всем ... вот тут ломаю голову над запросиком одним ... факрберд 2
короче есть таблица в ней есть поля дата... мне надо из этой таблицы вытащить все записи которые повторяются (дата не извесна ... то есть если есть 5 записей из низ 3 имеют ту же дату чтоб показало эти три)

извините за орфографию ... сам не русский
postaveche вне форума Ответить с цитированием
Старый 17.04.2011, 02:25   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
select YourDate, Count(*) as Cnt
from YourTable
group by YourDate
having count(*)>1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2011, 12:34   #3
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

а зачем присваевается коунту кнт??? он же нигде больше не используется
postaveche вне форума Ответить с цитированием
Старый 18.04.2011, 12:45   #4
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
Цитата:
Сообщение от postaveche Посмотреть сообщение
а зачем присваевается коунту кнт??? он же нигде больше не используется
Полю присваивается имя.
Какая у Вас база данных и какие компоненты использутся для доступа к ней? Как Вы в дальнейшем используете эти данные?
До свидания
P.S. Serge_Bliznykov Вам дал код как пример, для Вашего случая будет
Код:
having count(*)>2
Постарайтесь более конкретно описывать исходные данные и конечный результат, чтобы получать конкретный ответ.

Последний раз редактировалось OlegVE; 18.04.2011 в 12:50.
OlegVE вне форума Ответить с цитированием
Старый 18.04.2011, 12:57   #5
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

делаю всё в процедуре фаерберда

есть таблица к примеру

ид, дата, значение

мне надо зделать так : сумировать все значение... НО!!! если есть две идентичные даты мне надо средние значение ((дата1.значение + дата2.значение)/2)
postaveche вне форума Ответить с цитированием
Старый 18.04.2011, 13:02   #6
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Посмотрите следующую ссылку
http://stackoverflow.com/questions/7...-sql-statement
может это Вам поможет.
OlegVE вне форума Ответить с цитированием
Старый 18.04.2011, 13:19   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
мне надо сделать так : сумировать все значение...
НО!!! если есть две идентичные даты мне надо средние значение ((дата1.значение + дата2.значение)/2)
если в работе FireBird версии >= 2.X
то в нём есть вложенные запросы.
тогда решение проблемы банально (прямо из азбуки по SQL ):
Код:
select YourDate, (SumField / CntDate) as To_Shto_Nado from 
(select YourDate, sum(YourFieldForSum) as SumField, Count(*) as CntDate
from YourTable
group by YourDate)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2011, 12:04   #8
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

тут вышла еще одна ситуация которую надо решить... но никак не могу разобраться как решить

тоесть надо немного переделать эту функцию
есть таблица

id | data | zna4enie

допустим я ввожу дату1 01,01,2000 и дата2 31,12,2000
надо чтоб функция суммировало все значение... НО!!! если есть две идентичные даты мне надо средние значение ((дата1.значение + дата2.значение)/2) для каждого сезона (зима, весна, лето, осень) далее вычислить записи для каких сезонов есть и если допустим есть только для весны и лето то суммировать уже результаты и поделить на 2... если в 3 сезонах тогда на 3...
postaveche вне форума Ответить с цитированием
Старый 26.04.2011, 13:37   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дайте пример исходных данных (ну минимальное число строчек, чтобы увидеть то, о чём Вы пишете),
напишите, какой результат (по Вашему мнению) требуется получить.
Тогда легче будет Вам помочь!

я лично пока не очень понял, что Вам надо и почему запрос из поста #7 эту проблему не решает!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2011, 14:21   #10
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

вот как я поиздевался над той процедурой
Код:
create or alter procedure ALG_BDSTATIE (
    COD_S varchar(3),
    DATA1 date,
    DATA2 date)
returns (
    TBIOMASA double precision,
    TDENSITATE double precision,
    ASBIOMASA double precision,
    ASDENS double precision,
    BSBIOMASA double precision,
    BSDENS double precision,
    CSBIOMASA double precision,
    CSDENS double precision,
    DSBIOMASA double precision,
    DSDENS double precision,
    ESBIOMASA double precision,
    ESDENS double precision,
    FSBIOMASA double precision,
    FSDENS double precision,
    GSBIOMASA double precision,
    GSDENS double precision,
    HSBIOMASA double precision,
    HSDENS double precision,
    ISBIOMASA double precision,
    ISDENS double precision,
    KSBIOMASA double precision,
    KSDENS double precision,
    LSBIOMASA double precision,
    LSDENS double precision,
    ASDD double precision)
as
declare variable DATA date;
declare variable SBIO double precision;
declare variable SDENS double precision;
declare variable ASB double precision;
declare variable ASD double precision;
declare variable BSB double precision;
declare variable BSD double precision;
declare variable CSB double precision;
declare variable CSD double precision;
declare variable DSB double precision;
declare variable DSD double precision;
declare variable ESB double precision;
declare variable ESD double precision;
declare variable FSB double precision;
declare variable FSD double precision;
declare variable GSB double precision;
declare variable GSD double precision;
declare variable HSB double precision;
declare variable HSD double precision;
declare variable ISB double precision;
declare variable ISD double precision;
declare variable KSB double precision;
declare variable KSD double precision;
declare variable LSB double precision;
declare variable LSD double precision;
begin
***
for select data, (sbiomasa/cnt) as bm, (sdens/cnt) as dn, (asbio/cnt) as asb, (asdens/cnt) as asd, (bsb/cnt) as bsb, (bsd/cnt) as bsd,
(csb/cnt) as csb, (csd/cnt) as csd, (dsb/cnt) as dsb, (dsd/cnt) as dsd, (esb/cnt) as esb, (esd/cnt) as esd, (fsb/cnt) as fsb, (fsd/cnt) as fsd,
(gsb/cnt) as gsb, (gsd/cnt) as gsd, (hsb/cnt) as hsb, (hsd/cnt) as hsd, (isb/cnt) as isb, (isd/cnt) as isd, (ksb/cnt) as ksb, (ksd/cnt) as ksd,
(lsb/cnt) as lsb, (lsd/cnt) as lsd
from (select t.data, sum(tt.t_biomasa) as sbiomasa, sum(tt.t_densitate) as sdens, sum(tt.abiomasa) as asbio, sum(tt.adens) as asdens,
sum(tt.bbiomasa) as bsb, sum(tt.bdens) as bsd, sum(tt.cbiomasa) as csb, sum(tt.cdens) as csd, sum(tt.dbiomasa) as dsb, sum(tt.ddens) as dsd,
sum(tt.ebiomasa) as esb, sum(tt.edens) as esd, sum(tt.fbiomasa) as fsb, sum(tt.fdens) as fsd, sum(tt.gbiomasa) as gsb, sum(tt.gdens) as gsd,
sum(tt.hbiomasa) as hsb, sum(tt.hdens) as hsd, sum(tt.ibiomasa) as isb, sum(tt.idens) as isd, sum(tt.kbiomasa) as ksb, sum(tt.kdens) as ksd,
sum(tt.lbiomasa) as lsb, sum(tt.ldens) as lsd, count(*) as cnt
from alg_probe t, alg_bdprob tt
where t.cod_s = :cod_s
and t.data > :data1
and t.data < :data2
and t.id = tt.id_prob
group by t.data
having count(*)>0)
into :data, :sbio, :sdens, :asb, :asd, :bsb, :bsd, :csb, :csd, :dsb, :dsd, :esb, :esd, :fsb, :fsd, :gsb, :gsd, :hsb, :hsd, :isb, :isd, :ksb, :ksd, :lsb, :lsd
do
begin
tbiomasa = :tbiomasa + :sbio;
tdensitate = :tdensitate + :sdens;
asbiomasa = :asbiomasa + :asb;
asdens = :asdens + :asd;
bsbiomasa = :bsbiomasa + :bsb;
bsdens = :bsdens + :bsd;
csbiomasa = :csbiomasa + :csb;
csdens = :csdens + :csd;
dsbiomasa = :dsbiomasa + :dsb;
dsdens = :dsdens + :dsd;
esbiomasa = :esbiomasa + :esb;
esdens = :esdens + :esd;
fsbiomasa = :fsbiomasa + :fsb;
fsdens = :fsdens + :fsd;
gsbiomasa = :gsbiomasa + :gsb;
gsdens = :gsdens + :gsd;
hsbiomasa = :hsbiomasa + :hsb;
hsdens = :hsdens + :hsd;
isbiomasa = :isbiomasa + :isb;
isdens = :isdens + :isd;
ksbiomasa = :ksbiomasa + :ksb;
ksdens = :ksdens + :ksd;
lsbiomasa = :lsbiomasa + :lsb;
lsdens = :lsdens + :lsd;
asdd = :asd;
end
suspend;
end^
дело в том что если мне надо подсчитать результаты за один квартал, период (имею введу или за зиму или за весну или за осень или за лето) то эта процедура работает нормально

но допустим не надо подсчитать результаты за весь 2000-й год, тогда делается это так : надо проверить если есть записи зимой весной летом и осенью. Если есть записи только летом и осенью к примеру то надо выполнить процедуру что выше для лета и для осени, результаты суммировать и поделить но 2 (если записи есть для 3-х кварталов то выполняется для всех 3-х, суммируется а потом делится на 3)

Надеюсь выложил нормально ... если нет спросите попробую подробней выложить .... нужно очень срочно помогите чем можете
postaveche вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск замена значений из одной таблицы в другую Sofd Microsoft Office Excel 10 06.07.2011 11:36
удаление из таблицы повторяющихся значений CodeNOT PHP 2 28.03.2011 12:01
Перенос значений из одной таблицы в другую ЕСЛИ+ВПР? 804040 Microsoft Office Excel 2 05.05.2010 14:38
обмен значений записей одной таблицы GothicAr SQL, базы данных 0 09.04.2010 18:01
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57