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

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

24.09.2010, 12:49. Показов 7087. Ответов 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
36 / 35 / 3
Регистрация: 12.06.2009
Сообщений: 211
24.09.2010, 13:12
а чем DISTINKT тебе мешает ?
Пример:
SQL
1
SELECT DISTINCT column_name(s) FROM TABLE_NAME
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
24.09.2010, 13:23  [ТС]
VampireKB, а как он сумировать будет значение другого поля при совпадении?
0
36 / 35 / 3
Регистрация: 12.06.2009
Сообщений: 211
24.09.2010, 13:32
SQL
1
SELECT COUNT(DISTINCT column_name) FROM TABLE_NAME
Если ты имеешь ввиду такбличное поле Count ,то ,наверное можно с SUM поиграться..
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
24.09.2010, 13:35  [ТС]
VampireKB, не пойдет...
вот пример:

Name | Count
--------------
qwe | 2
qwe | 3
asd | 4
dfg | 3

в результате должно получиться:
Name | Count
--------------
qwe | 5
asd | 4
dfg | 3
0
36 / 35 / 3
Регистрация: 12.06.2009
Сообщений: 211
24.09.2010, 13:46
SQL
1
SELECT DISTINCT(T1),SUM(T2) AS SUM_ID FROM TEST GROUP BY T1
вполне работает....

Было
1 10
1 20
1 30
2 10
2 20

СТАЛО
1 60
2 30
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
24.09.2010, 13:48  [ТС]
VampireKB, спасибо) буду пробывать! ))
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
24.09.2010, 17:33
VampireKB, При использовании GROUP BY T1 с SUM(T2) использовать DISTINCT(T1) излишне. Можно просто
SQL
1
SELECT T1 , SUM(T2) AS SUM_ID FROM TEST GROUP BY T1
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 09:02  [ТС]
запрос работает на ура! Спасибо! )))

Тепеть появился еще одни вопрос, по составлению сложного запроса (вложенного).

Ситуация такая:

Есть три таблицы:

tblStend - содержит имена стендов
-------------------
key| Name |
------------------

tblBlock - содержит списки блоков, для каждого стенда.
-----------------------
key| Stend_id | Name |
-----------------------

tblDetail - содержит списки деталей для каждого блока.
------------------------------
key | Block_id | Name | Count |
------------------------------

Нужно сформировать таблицу, в которой будут отображены все детали для некоторого стенда, при формировании нужно исключать повторения, сумируя значения по полю Count. При этом названия блоков в таблице не учитывать.

p.s. в ручную составить не проблема, а вот с запросом не понятно...
0
215 / 215 / 20
Регистрация: 18.05.2010
Сообщений: 865
27.09.2010, 10:23
Может типа такого
SQL
1
2
3
4
5
6
7
SELECT s.[KEY], b.[Stend_id], d.[Block_id], SUM(d.[COUNT]) 
       FROM tblStend s 
            INNER JOIN tblBlock b 
                  ON s.[KEY]=b.[Stend_id]
            INNER JOIN tblDetail d
                  ON b.[KEY]=d.[Block_id]
            GROUP BY s.[KEY], b.[Stend_id], d.[Block_id]
Не мешало бы вам показать структуру таблицы с ключами и с примерными данными. Пример данных и сами скрипты которыми вы создаетет таблицы покажите.
1
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
27.09.2010, 10:39
Дополняя в этом же направлении:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--Вывод списка всех типов деталей для данного блока с подсчётом количества деталей
--по каждому типу.
SELECT
  tb.stend_id,
  tb.key AS block_id,
  tb.name AS block_name,
  td.key AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblBlock AS tb INNER JOIN tblDetail AS td
  ON
    tb.key = td.block_id
GROUP BY
  tb.stend_id,
  tb.key,
  tb.name,
  td.key,
  td.name
HAVING
  tb.key = :block_id
SQL
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
--Вывод списка всех типов деталей для данного блока с подсчётом количества деталей
--по каждому типу.
--И вывод итоговой строки с общим количеством всех деталей по этому блоку.
SELECT
  tb.stend_id,
  tb.key AS block_id,
  tb.name AS block_name,
  td.key AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblBlock AS tb INNER JOIN tblDetail AS td
  ON
    tb.key = td.block_id
GROUP BY
  tb.stend_id,
  tb.key,
  tb.name,
  td.key,
  td.name
HAVING
  tb.key = :block_id
UNION ALL
SELECT
  tb.stend_id,
  tb.key AS block_id,
  tb.name AS block_name
  '-1' AS detail_id,
  'Кол-во деталей' AS detail_name
  SUM(td.count) AS sum_detail_count
FROM
  tblBlock AS tb INNER JOIN tblDetail AS td
  ON
    tb.key = td.block_id
GROUP BY
  tb.stend_id,
  tb.key,
  tb.name,
  '-1',
  'Кол-во деталей'
HAVING
  tb.key = :block_id
;
1
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
27.09.2010, 10:55
DenProx, В одной и тем я обращал внимание на некорректность использования зарезвированных слов при именовании полей. Count - это зарезвированное слово. Использовать его в качестве имент поля можно, но не нужно.
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 10:56  [ТС]
вот база для примера:
Вложения
Тип файла: rar Копия BD.rar (53.1 Кб, 16 просмотров)
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 11:22  [ТС]
вот набросал схемку, чтобы наглядно была понятна задача))

на первом, как оно выглядит изначально, на втором что должно получиться)
Миниатюры
SQL запрос с условиями   SQL запрос с условиями  
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
27.09.2010, 11:46
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--Вывод списка всех типов деталей для данного стенда с подсчётом количества деталей
--по каждому типу.
SELECT
  ts.key AS stend_id,
  ts.name AS stend_name,
  td.key AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblStend AS ts INNER JOIN tblBlock AS tb
  ON
    ts.key = td.stend_id
  INNER JOIN tblDetail AS td
  ON
    tb.key = td.block_id
GROUP BY
  ts.key,
  ts.name,
  td.key,
  td.name
HAVING
  ts.key = :stend_id
---
Возможно, ts.key = :stend_id я зря в having записал. Можно перенести в раздел from - on или в where:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--Вывод списка всех типов деталей для данного стенда с подсчётом количества деталей
--по каждому типу.
SELECT
  ts.KEY AS stend_id,
  ts.name AS stend_name,
  td.KEY AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblStend AS ts INNER JOIN tblBlock AS tb
  ON
    ts.KEY = td.stend_id
  INNER JOIN tblDetail AS td
  ON
    tb.KEY = td.block_id
WHERE
  ts.KEY = :stend_id
GROUP BY
  ts.KEY,
  ts.name,
  td.KEY,
  td.name
В Having следует помещать условия по агрегированным полям - например: having sum(td.count) > 10
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 11:48  [ТС]
Mawrat, что то не хочет... пишет что ошибка синтаксиса, пропущен оператор
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
27.09.2010, 11:53
Там в одном месте вместо td надо было написать tb. Но ошибка не из-за этого. Может быть SQL интерпретатор не ладит с join.
В общем, надо попробовать 2 варианта:
1. C JOIN:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--Вывод списка всех типов деталей для данного стенда с подсчётом количества деталей
--по каждому типу.
SELECT
  ts.key AS stend_id,
  ts.name AS stend_name,
  td.key AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblStend AS ts INNER JOIN tblBlock AS tb
  ON
    ts.key = tb.stend_id
  INNER JOIN tblDetail AS td
  ON
    tb.key = td.block_id
GROUP BY
  ts.key,
  ts.name,
  td.key,
  td.name
HAVING
  ts.key = :stend_id
2. Без JOIN:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--Вывод списка всех типов деталей для данного стенда с подсчётом количества деталей
--по каждому типу.
SELECT
  ts.KEY AS stend_id,
  ts.name AS stend_name,
  td.KEY AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblStend AS ts,
  tblBlock AS tb,
  td.stend_id 
WHERE
  ts.KEY = :stend_id
  AND ts.KEY = tb.stend_id
  AND tb.KEY = td.block_id
GROUP BY
  ts.KEY,
  ts.name,
  td.KEY,
  td.name
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 11:58  [ТС]
Mawrat, снова что то не так... в первом варианте таже ошибка, а во втором, пишет что таблица tb не найдена по указаному пути...
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
27.09.2010, 12:27
Да - в разделе from - не то. DenProx, попробуй так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--Вывод списка всех типов деталей для данного стенда с подсчётом количества деталей
--по каждому типу.
SELECT
  ts.KEY AS stend_id,
  ts.name AS stend_name,
  td.KEY AS detail_id,
  td.name AS detail_name,
  SUM(td.count) AS sum_detail_count
FROM
  tblStend AS ts,
  tblBlock AS tb,
  tblDetail AS td
WHERE
  ts.KEY = :stend_id
  AND ts.KEY = tb.stend_id
  AND tb.KEY = td.block_id
GROUP BY
  ts.KEY,
  ts.name,
  td.KEY,
  td.name
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
27.09.2010, 12:33  [ТС]
Mawrat, что то с разделом WHERE не так... опять ошибка...

p.s. попробуте на базе которую я выложил поэксперементировать, может так понятней будет что не работает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2010, 12:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru