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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2015, 20:12   #1
Shingis
Пользователь
 
Регистрация: 09.04.2009
Сообщений: 27
По умолчанию Нужен срочно помощь по sql запросами (ADO)

Есть таблица student с несколькими полями.
Имена поля - ФИО Курс Пол Дата_рождения Дата_поступления Дата Выпуска Льготы.
И еще есть второй таблица Lgoti(Льготы) c несколькими полями.
Имена поля- Наименование_льгот Принята в отч.году (муж-жен) Общая численность (муж-жен) Выпущено в отч.году (муж-жен)
Нужно --
(Найти количество студентов по видом льготы (есть 6 видов льготы) и из них сколько муж и жен (Пол) и сколько студентов 1- го курса и общ. количество студентов с такими льготами и количество студтенов выпущенные в отчетном году (например отчет в месяце октября)) с таблицей student
И вставить эти данный(количество студентов) в таблицу Lgoti(Льготы).
---
А по возрастам я уже решил так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var I:Integer;
    StrFielName:String;
    TempNumberCount,TempCountM,TempCountJ:Integer;
    oper_date:TDateTime;
    Begin
  oper_date:=DateTimePicker1.Date;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('DELETE FROM KONT_OLD');
  ADOQuery2.ExecSQL;

  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('SELECT * FROM KONT_OLD');
  ADOQuery2.Active:=True;
  FieldNameRusDbGrid;/// это проста процедура колумнс дбгрида заменить на рус.

  For I := 1 To 3 Do
      Begin
        ADOQuery2.Insert;
        If I=1 Then ADOQuery2.FieldByName('Naimenovanie').AsString:='Всего';
        if I=2 Then ADOQuery2.FieldByName('Naimenovanie').AsString:='М';
        if I=3 Then ADOQuery2.FieldByName('Naimenovanie').AsString:='Ж';
        ADOQuery2.Post;
        ADOQuery2.Next
      End;

  ADOQuery1.First;
  For I := 1 To ADOQuery1.RecordCount Do
      Begin
        StrFielName:='';
        Case YearsBetween(ADOQuery1.FieldByName('Год_рождения').AsDateTime, Now) Of
       1..13:StrFielName:='do_14_let';
          14:StrFielName:='S_14_let';
          15:StrFielName:='S_15_let';
          16:StrFielName:='S_16_let';
          17:StrFielName:='S_17_let';
          18:StrFielName:='S_18_let';
          19:StrFielName:='S_19_let';
          20:StrFielName:='S_20_let';
          21:StrFielName:='S_21_let';
          22:StrFielName:='S_22_let';
          23:StrFielName:='S_23_let';
          24:StrFielName:='S_24_let';
      25..29:StrFielName:='S_25_29_let';
      30..34:StrFielName:='S_30_34_let';
      35..39:StrFielName:='S_35_39_let';
     40..100:StrFielName:='S_40_let_i_starche';
        End;
        If StrFielName<>'' then
           Begin
             If ADOQuery1.FieldByName('Пол').AsString='Муж' then
                Begin
                  Vremenno.SQL.Clear;
                  Vremenno.SQL.Add('SELECT '+StrFielName+' FROM KONT_OLD');
                  Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('М'));
                  Vremenno.Active:=True;
                  TempNumberCount:=Vremenno.FieldByName(StrFielName).AsInteger;
                  Vremenno.SQL.Clear;
                  Vremenno.SQL.Add('UPDATE KONT_OLD SET '+StrFielName+'='+IntToStr(TempNumberCount+1));
                  Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('М'));
                  Vremenno.ExecSQL;
                End;

             If ADOQuery1.FieldByName('Пол').AsString='Жен' then
                Begin
                  Vremenno.SQL.Clear;
                  Vremenno.SQL.Add('SELECT '+StrFielName+' FROM KONT_OLD');
                  Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('Ж'));
                  Vremenno.Active:=True;
                  TempNumberCount:=Vremenno.FieldByName(StrFielName).AsInteger;
                  Vremenno.SQL.Clear;
                  Vremenno.SQL.Add('UPDATE KONT_OLD SET '+StrFielName+'='+IntToStr(TempNumberCount+1));
                  Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('Ж'));
                  Vremenno.ExecSQL;
                End;
             Vremenno.SQL.Clear;
             Vremenno.SQL.Add('SELECT '+StrFielName+' FROM KONT_OLD');
             Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('М'));
             Vremenno.Active:=True;
             TempCountM:=Vremenno.FieldByName(StrFielName).AsInteger;

             Vremenno.SQL.Clear;
             Vremenno.SQL.Add('SELECT '+StrFielName+' FROM KONT_OLD');
             Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('Ж'));
             Vremenno.Active:=True;
             TempCountJ:=Vremenno.FieldByName(StrFielName).AsInteger;

             Vremenno.SQL.Clear;
             Vremenno.SQL.Add('UPDATE KONT_OLD SET '+StrFielName+'='+IntToStr(TempCountM+TempCountJ));
             Vremenno.SQL.Add('WHERE NAIMENOVANIE='+QuotedStr('Всего'));
             Vremenno.ExecSQL;
           End;
        ADOQuery1.Next;
      End;
     ADOQuery2.Active:=False;
     ADOQuery2.Active:=True;
end;
end.
И по этим алгоритмом ник как не могу решить с льготами. Пожалуйста нужен срочно Ваши помощи!

Последний раз редактировалось Stilet; 29.03.2015 в 20:21.
Shingis вне форума Ответить с цитированием
Старый 29.03.2015, 21:01   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
(Найти количество студентов по видом льготы (есть 6 видов льготы) и из них сколько муж и жен (Пол)
И что здесь делает ваши код ? Можно просто написать JOIN или подзапрос, отложить его и SELECT-е выбрать как таблица . А так написали 9-етажни код и в общем не относится Т.З

Цитата:
в отчетном году (например отчет в месяце октября))
И для этого написали это код ?
Код:
 oper_date:=DateTimePicker1.Date;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('DELETE FROM KONT_OLD');
  ADOQuery2.ExecSQL;
DELETE Это что ? я лучше промолчу

Последний раз редактировалось Stilet; 30.03.2015 в 08:22.
xxbesoxx вне форума Ответить с цитированием
Старый 30.03.2015, 07:51   #3
Shingis
Пользователь
 
Регистрация: 09.04.2009
Сообщений: 27
По умолчанию

Здравствуй xxbesoxx!
Здесь:
Код:
/// oper_date:=DateTimePicker1.Date;- этот строк лишний. Сюда не касается, прост скопировалась 
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('DELETE FROM KONT_OLD');
  ADOQuery2.ExecSQL;
А остальное норма.
С помощью этих код я определяю возраст с таблицы student и вставляю в таблицу KONT_OLD. А в таблице KONT_OLD есть поля StrFielName(это переменное которое присваивает имени поля в таблице).
А то что касается -(И что здесь делает ваши код ? Можно просто написать JOIN или подзапрос, отложить его и SELECT-е выбрать как таблица . А так написали 9-етажни код и в общем не относится Т.З) я только начал работать с sql(ADO). А как работать с JOIN приведите пример?!

И еще эту задачу я решил в аксесе (sql запросы). Это выглядит так:
Но в этом запросе делфи не понимает oper_date. И тоже не могу как это присваивать и куда?((((
Код:
SELECT DISTINCT "1" as 1, "Вид льготности" AS name, (select count(*) FROM student WHERE Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Вид льготности")
and Пол ="Муж") AS Man, (select count(*) FROM student WHERE  Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Вид льготности")
and Пол ="Жен") AS Woman, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы ("Вид льготности")
and Пол ="Муж") AS man1, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы ("Вид льготности")
and Пол ="Жен"
) AS woman1, (
select count(*) FROM student WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Вид льготности")
and Пол ="Муж"
) AS man2, (
select count(*) FROM  student  WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Вид льготности")
and Пол ="Жен"
) AS woman2
FROM dnk
Вид льготности есть 6 вида, а здесь пример только на одну.
Надеюсь будет помощь с Ваши стороны ((

Последний раз редактировалось Stilet; 30.03.2015 в 08:22.
Shingis вне форума Ответить с цитированием
Старый 30.03.2015, 09:37   #4
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Но в этом запросе делфи не понимает oper_date. И тоже не могу как это присваивать и куда?((((
Delphi все понимает . Но, ваши код на #1 кривой ! его надо убрать . Не обижайтесь...
Цитата:
решил в аксесе (sql запросы). Это выглядит так:
Можно там отложить запрос и потом вызвать его как таблица из Delphi
Изображения
Тип файла: jpg Zapos1.jpg (73.9 Кб, 123 просмотров)
Тип файла: jpg Zapros2.jpg (62.4 Кб, 116 просмотров)

Последний раз редактировалось xxbesoxx; 30.03.2015 в 10:04.
xxbesoxx вне форума Ответить с цитированием
Старый 30.03.2015, 11:54   #5
Shingis
Пользователь
 
Регистрация: 09.04.2009
Сообщений: 27
Печаль

Не получается
Shingis вне форума Ответить с цитированием
Старый 30.03.2015, 12:54   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Не получается
Ваши запрос который на #3 как вы говорите что он работает ! сохраните его и дадите осмыслены имя . Потом обращайте к ним через ваши Adoquery как таблица
Код:
SELECT *  FROM Имя_запроса.
как по другому объяснить ?

Последний раз редактировалось xxbesoxx; 30.03.2015 в 12:58.
xxbesoxx вне форума Ответить с цитированием
Старый 30.03.2015, 14:56   #7
Shingis
Пользователь
 
Регистрация: 09.04.2009
Сообщений: 27
По умолчанию

В этом запросе есть некая 'oper_date' который я сам вожу в ручную дату! Вот с этой датой проверяется таблица. А если этого запроса подключаю к делфи как таблица, уже не понимает 'oper_date' а.
Shingis вне форума Ответить с цитированием
Старый 30.03.2015, 15:45   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
and Льготы in ("Вид льготности")
and Льготы ("Вид льготности")
Что значит вторая строка?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2015, 06:43   #9
Shingis
Пользователь
 
Регистрация: 09.04.2009
Сообщений: 27
По умолчанию

Здравствуйте! Блин там проста ошибка, была подправка и тогда стерлась команда "in"
Вот такая должно быть:
Это по первому виду Льготности: (Количества те студентов который Сирота)
Код:
SELECT DISTINCT "1" as 1, "Сирота" AS name, (select count(*) FROM student WHERE Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Сирота")
and Пол ="Муж") AS Man, (select count(*) FROM student WHERE  Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Сирота")
and Пол ="Жен") AS Woman, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы in ("Сирота")
and Пол ="Муж") AS man1, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы in ("Сирота")
and Пол ="Жен"
) AS woman1, (
select count(*) FROM student WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Сирота")
and Пол ="Муж"
) AS man2, (
select count(*) FROM  student  WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Сирота")
and Пол ="Жен"
) AS woman2
FROM dnk
//А это по вторым видам Льготности (Количества те студентов который Инвалид 1гр.)

Union
SELECT DISTINCT "1" as 1, "Инвалид 1гр." AS name, (select count(*) FROM student WHERE Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Инвалид 1гр.")
and Пол ="Муж") AS Man, (select count(*) FROM student WHERE  Год_поступления <oper_date and  year(Год_поступления) = year(oper_date)
and Льготы in ("Инвалид 1гр.")
and Пол ="Жен") AS Woman, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы in (Инвалид 1гр.")
and Пол ="Муж") AS man1, (select count(*) FROM student WHERE Год_выпуска is null
and Льготы in ("Инвалид 1гр.")
and Пол ="Жен"
) AS woman1, (
select count(*) FROM student WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Инвалид 1гр.")
and Пол ="Муж"
) AS man2, (
select count(*) FROM  student  WHERE Год_выпуска is not null and  year(Год_выпуска) = year(oper_date)
and Льготы in ("Инвалид 1гр.")
and Пол ="Жен"
) AS woman2
FROM dnk
В этом запросе находить студентов по видам льготы из студентов по отдельности курсом(1 курс, все и выпущенные) и пола(муж-жен)

Последний раз редактировалось Stilet; 31.03.2015 в 06:59.
Shingis вне форума Ответить с цитированием
Старый 31.03.2015, 08:43   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вместо этого монстра чего-нибудь в таком духе
Код:
SELECT Льготы,Пол,
    SUM(IIF(Year(Дата_поступления)=Year(oper_date),1,0)) AS Count1,
    SUM(IIF(Дата_выпуска is null,1,0)) AS Count2,
    SUM(IIF(Year(Дата_выпуска)=Year(oper_date),1,0)) AS Count3
  FROM student
  WHERE Льготы IN ("Сирота","Инвалид 1гр.") AND Пол IN ("Муж","Жен")
  GROUP BY Льготы,Пол
Пол IN из where можно убрать, если других полов у студентов нет. Мало ли чего Аналогично и Льготы IN можно убрать, если других нет

В программе такой запрос может выглядеть примерно так
Код:
  oper_date:=Trunc(DateTimePicker1.Date);
  ADOQuery1.Active:=False;
  ADOQuery1.SQL.Text:='SELECT Льготы,Пол,'+
                      '    SUM(IIF(Year(Дата_поступления)=Year(:operdate1),1,0)) AS Count1,'+
                      '    SUM(IIF(Дата_выпуска is null,1,0)) AS Count2,'+
                      '    SUM(IIF(Year(Дата_выпуска)=Year(:operdate2),1,0)) AS Count3'+
                      '  FROM student'+
                      '  WHERE Льготы IN ("Сирота","Инвалид 1гр.") AND Пол IN ("Муж","Жен")'+
                      '  GROUP BY Льготы,Пол';
  ADOQuery1.Parameters.ParamByName('operdate1'):=oper_date;
  ADOQuery1.Parameters.ParamByName('operdate2'):=oper_date;
  try
    ADOQuery1.Active:=True;
  except
    //здесь обработка ошибки
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно нужна помощь по SQL @ngel111 Фриланс 2 29.12.2014 14:59
Работа с SQL запросами курбанниязов Помощь студентам 2 23.04.2014 17:00
Проблемы с SQL запросами Molekula Общие вопросы Delphi 0 01.11.2012 09:49
Помогите с SQL-запросами DIMON_X БД в Delphi 3 22.04.2007 19:36