Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/33: Рейтинг темы: голосов - 33, средняя оценка - 4.94
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109

SQL запрос с условиями

24.09.2010, 12:49. Показов 7477. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. У меня такой вопрос: нужно составить запрос SQL так что бы присутствовали операторы IF.

Если быть точнее, ситуация такая: нужно сформировать таблицу в которой изначально есть совпадения, но по ходу формирования нужно, их исключать при этом сумировать количество, типа, если уже есть запись, в поле Count (Количество) прибавить соответствующее значение...

что можете посоветовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2010, 12:49
Ответы с готовыми решениями:

Вывод 3 столбцов с условиями после выполнения SQL запроса
Помогите пожалуйста сделать запрос. with qqry do begin SQL.Clear; SQL.Add('SELECT SUM(PRICE) FROM OOC WHERE...

Динамический sql запрос с 4-мя независимыми условиями
Всем привет. Возникла следущая проблема-нужно составить динамический sql запрос, который может содержать до 4-х(включительно) независимых...

sql запрос для БазыДанных с условиями
Уваж Форумчане! Поправьте новичка! Пишу запрос для схемы БД! Дайте пару советов по корректировке! Выбрать все товары по стоимости ниже...

80
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 14:12  [ТС]
Студворк — интернет-сервис помощи студентам
Lord_Voodoo, я попробывал использывать distinct, но пока что то не выходит... в Accesse тестирую, выдает ошибку....
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 14:18
DenProx, да вы не поняли... в вашем запросе не нужен distinct, это так - информация к размышлению
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 14:20  [ТС]
Lord_Voodoo, я совсем уже запутался... Distinct не нужен, Group by не дает нужного результата... что тогда нужно??
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 14:31
DenProx, уменьшить поля в выборке, что же непонятного... любое отличие в полях, которые указаны в группировке, приводит к порождению новой записи в выходной выборке
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 14:33  [ТС]
Lord_Voodoo, если их уиеньшить, то придется и уменьшить в SELECT , если их не будет в SELECT то таблица не будет знать об оставшихся полях, и будет говорить что поля не найдены...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 14:41
DenProx, ну тогда вместо агрегатных функций используйте вложенные запросы
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 14:42  [ТС]
Lord_Voodoo, а можно на примере? )
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 14:50
SQL
1
2
3
4
5
SELECT Sostav2.SectionName, Sostav2.SortName, Sostav2.ObosnachName, 
(SELECT SUM(Sostav2.Count) FROM Sostav2  t2 WHERE t2.key = t1.key) AS count_sum,
(SELECT SUM(Sostav2.Sklad)  FROM Sostav2  t2 WHERE t2.key = t1.key) AS sklad_sum
FROM Sostav2 t1
GROUP BY Sostav2.SectionName, Sostav2.SortName, Sostav2.ObosnachName;
а вообще покажите результат выполнения вашего запроса и что вас не устраивает
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
28.09.2010, 14:50
Цитата Сообщение от DenProx Посмотреть сообщение
смысл группировки в том чтобы исключить повторяющиеся записи
Нет, смысл группировки заключается в группировке, и только. И если у Вас используется
SQL
1
2
GROUP BY Sostav2.id, Sostav2.SectionName, Sostav2.SortName,
Sostav2.ObosnachName, Sostav2.Nujno, Sostav2.Price, Sostav2.Summa, COUNT, Sklad
то всего навсего не бубут повторяться сочетания этих полей. Далее в GROUP BY напишите везде квалификаторы. Вместо Count, Sklad напишите Sostav2.Count, Sostav2.Sklad. Как Ваш сервер проглатывает count без квалификатора - для меня загадка.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 14:53  [ТС]
Lord_Voodoo, результат простой - просто ни чего не изменяется...


SAMZ, я понимаю что это группировка, просто в моем случае группировка помогает избежать повторяющиеся записи...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 14:58
DenProx, ну так выведи его и покажи, где лишние строки...
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 15:00  [ТС]
SAMZ, вот:
SQL
1
2
3
SELECT Sostav2.SectionName, Sostav2.SortName, Sostav2.ObosnachName, Sostav2.Nujno, Sostav2.Price, Sostav2.Summa, SUM(Sostav2.Count) AS count_sum, SUM(Sostav2.Sklad) AS sklad_sum
FROM Sostav2
GROUP BY Sostav2.SectionName, Sostav2.SortName, Sostav2.ObosnachName, Sostav2.Nujno, Sostav2.Price, Sostav2.Summa, Sostav2.Count, Sostav2.Sklad;
суть не именилась...

вот результат:
Миниатюры
SQL запрос с условиями  
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 15:05
DenProx, т.е. вы хотите, что бы комутаторы были одной строкой?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.09.2010, 17:10  [ТС]
Lord_Voodoo, Ну да) в общем исходя из этого примера, 2,3 и 4 строки должны быть одной, а значения в полях Count и Sklad просумировались от этих трех строк...
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
28.09.2010, 19:54
DenProx, Вам нужно понять, что такое группировка. При группировке в набор включаются все имеющиеся сочетания полей, включенных в предложение Group By. Посмотрите внимательно на Ваш пример. В строках 2,3, и 4 колонки Summa и Nujno имеют различающиеся значения и именно поэтому Вы и получаете такой результат. Достаточно исключить из запроса эти колонки и, естественно исключить их же из списка Group By и Вы получите требуемый результат.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.09.2010, 21:46
SAMZ, я уже это где-то вверху писал, но вот либо запрос сгруппирует, как он хочет, либо группировка кривая, не понимает, что мысли надо читать у разработчика, а потом уже выводить данные
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
29.09.2010, 12:12  [ТС]
Цитата Сообщение от SAMZ Посмотреть сообщение
Достаточно исключить из запроса эти колонки и, естественно исключить их же из списка Group By и Вы получите требуемый результат.
если я их уберу из запроса, то таблица об них не узнает.... мне нужно сгруппировать таблицу, и вывести в отчет... как я их тогда заполнять буду?
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
29.09.2010, 12:55
если я их уберу из запроса, то таблица об них не узнает
Я пояснил как работает group by и это ограничение при наклыдываемых Вами требованиях в рамках одного запроса не обойти. Вы можете формировать два запроса. Один мастер запрос в соответствии с Вашими требованиями, но без тех полей, которыя я назвал. Втрой детэйл запрос, в котором будут представлены эти поля. Навигацией по этим двум таблицам формируете отчет.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
30.09.2010, 09:16  [ТС]
SAMZ, а у вас примера не будет? ))

Добавлено через 53 минуты
попробывал так:
SQL
1
2
3
4
SELECT SectionName 
 (SELECT COUNT FROM Sostav2) 
FROM Sostav2
GROUP BY SectionName;
но по моему это бред какой то)))

Добавлено через 19 часов 25 минут
в общем задолбался с этим SQL - ем...
сделал все вручную... если кому то это поможет, вот код:
Delphi
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
procedure TfmUchet.N3Click(Sender: TObject);
var     t: TfrxMemoView;
    NujnoTmp: integer;
begin
t := TfrxMemoView(DM.Sostav2.FindObject('Memo3'));
if t <> nil then
     t.Memo.Text := DM.QStend['StendName'];
 
DM.QSostav2.Active := True;
DM.QSostav2.First;
while not DM.QSostav2.Eof do
  DM.QSostav2.Delete;
 
 DM.QBlock.Active:=False;
 DM.QBlock.SQL.Clear;
 DM.QBlock.SQL.Add('SELECT *');
 DM.QBlock.SQL.Add('FROM tblBlock');
 DM.QBlock.SQL.Add('WHERE (Stend_ID=:Key)');
 DM.QBlock.Active:=True;
 DM.QBlock.First;
  while not DM.QBlock.Eof do
    begin
      DM.QDetail.Active := False;
      DM.QDetail.SQL.Clear;
      DM.QDetail.SQL.Add('SELECT tblDetailSpr.Price, tblDetail.*');
      DM.QDetail.SQL.Add('FROM  tblDetailSpr INNER JOIN tblDetail ON tblDetailSpr.[Key] = tblDetail.Price_ID');
      DM.QDetail.SQL.Add('WHERE Block_ID = '+IntToStr(DM.QBlockSpr['Key']));
      DM.QDetail.Active := True;
      DM.QDetail.First;
      while not DM.QDetail.Eof do
        begin
        if not DM.QSostav2.Locate('ObosnachName',DM.QDetail['Obosnach_Name'],[loCaseInsensitive,loPartialKey]) then
         begin
          DM.QSostav2.Insert;
          DM.QSostav2['SectionName'] := DM.QDetail['Section_Name'];
          DM.QSostav2['SortName'] := DM.QDetail['Sort_Name'];
          DM.QSostav2['ObosnachName'] := DM.QDetail['Obosnach_Name'];
 
          NujnoTmp := DM.QDetail['Sklad'] - DM.QDetail['Count'];
 
          if NujnoTmp < 0 then
            DM.QSostav2['Nujno'] := NujnoTmp * (-1) else
            DM.QSostav2['Nujno'] := 0;
 
          if DM.QDetail['Count'] <> Null then
            DM.QSostav2['Count'] := DM.QDetail['Count'];
 
          if DM.QDetail['Price'] <> Null then
            DM.QSostav2['Price'] := DM.QDetail['Price'];
 
          DM.QSostav2['Summa'] := DM.QDetail['Price'] * DM.QDetail['Count'];
          DM.QSostav2['Sklad'] := DM.QDetail['Sklad'];
 
          DM.QSostav2.Post;
         end else
         begin
          DM.QSostav2.Locate('ObosnachName',DM.QDetail['Obosnach_Name'],[loCaseInsensitive,loPartialKey]);
          DM.QSostav2.Edit;
            DM.QSostav2['Count'] := DM.QSostav2['Count'] + DM.QDetail['Count'];
            DM.QSostav2['Price'] := DM.QSostav2['Price'] + DM.QDetail['Price'];
            DM.QSostav2['Summa'] := DM.QSostav2['Price'] * DM.QSostav2['Count'];
          NujnoTmp := DM.QSostav2['Sklad'] - DM.QSostav2['Count'];
 
          if NujnoTmp < 0 then
            DM.QSostav2['Nujno'] := NujnoTmp * (-1) else
            DM.QSostav2['Nujno'] := 0;
 
          DM.QSostav2.Post;
         end;
      DM.QDetail.Next;
      end;
  DM.QBlock.Next;
  end;
 
DM.Sostav2.ShowReport();
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
30.09.2010, 09:44
DenProx, и этот код убрал лишние записи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2010, 09:44

SQL запрос с несколькими не обязательными условиями
Добрый день, коллеги! Пытаюсь сделать выборку из базы данных с условиями. Условия указываются в нескольких Combobox (на текущий...

SQL запрос для поиска значений с 2-мя условиями
Задача: найти значение поля status по наибольшей дате(idate) для каждого (уникального) договора (id_dogovor) Таблица вида: ...

Запрос с условиями
Здравствуйте! Пишу админку для галереи. Всё работает...но хотелось бы сделать всё работало красиво :) В общем есть 2 таблица в базе, одна...

Запрос с условиями
Здравствуйте! Пишу админку для галереи. Всё работает...но хотелось бы сделать всё работало красиво В общем есть 2 таблица в базе, одна...

Запрос с противоположными условиями
Существует база с двумя таблицами один ко многим. Создаю запрос для выборки из главной таблицы записей по условию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru