Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
1 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 41

Вычитание двух запросов MS SQL

05.03.2013, 16:10. Показов 10213. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите решить проблему.
Не получается правильно составить запрос, который высчитывал разницу двух запросов.
Для того, чтобы получить количество товара на складе, нужно из суммы всех товаров от всех поставщиков вычесть сумму проданного товара.
Есть два отдельных запроса.
1. Высчитывает сумму всех товаров от всех поставщиков.
SQL
1
2
3
4
5
6
7
8
SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) AS Dat, SUM(nb.TEreport.ves_vesi) AS Tovar
FROM         nb.TEreport INNER JOIN
                      nb.TEprovider ON nb.TEreport.id_provider = nb.TEprovider.id
WHERE     (LEFT(nb.TEprovider.name, 9) != 'СО СКЛАДА') AND (CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) <= CONVERT(VARCHAR, GETDATE(),
                      102))
        AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102)
ORDER BY Dat DESC
2. Высчитывает сумму проданного товара.
SQL
1
2
3
4
5
6
7
8
SELECT     CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) AS Dat, SUM(nb.TEreport.ves_vesi) AS Tovar
FROM         nb.TEreport INNER JOIN
                      nb.TEnitka ON nb.TEreport.id_nitka = nb.TEnitka.id
WHERE     (SUBSTRING(nb.TEnitka.name, 5, 8) != 'на склад') AND (CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) <= CONVERT(VARCHAR,
                      GETDATE(), 102))
                      AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102)
ORDER BY Dat DESC
Пробовала сделать с помощью подзапросов, но выходит не то, что нужно.
Например,
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT     CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) AS Dat,
           (SELECT SUM(nb.TEreport.ves_vesi) 
            FROM nb.TEreport INNER JOIN nb.TEprovider ON nb.TEreport.id_provider = nb.TEprovider.id
            WHERE LEFT(nb.TEprovider.name, 9) != 'СО СКЛАДА')-
            (SELECT SUM(nb.TEreport.ves_vesi) 
            FROM nb.TEreport INNER JOIN nb.TEnitka ON nb.TEreport.id_nitka = nb.TEnitka.id
            WHERE SUBSTRING(nb.TEnitka.name, 5, 8) != 'на склад')
FROM nb.TEreport
WHERE     CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102)
          AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102)
ORDER BY Dat ASC
Но в таком случае, запрос выдаёт не конкретную сумму за определённый день, а суммирует все числа за весь период.
Как можно решить проблему?

P.S. Дата хранится в секундах, поэтому используется конвертер даты.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2013, 16:10
Ответы с готовыми решениями:

Как можно получить код SQL-запросов из лога транзакций ldf MS SQL Server2k?
Хая! Это вообще возможно??

Запрос на суммирование двух полей и вычитание третьего
Добрый день! Подскажите как такой запрос реализовывается: Имеется таблица Main, у нее поле id уникально, есть три таблицы у которых поле...

Создание sql-запросов
Доброго времени суток. Есть таблица производителей MF_ID, MF_NAME

9
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
05.03.2013, 18:09
Схема данных чья?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
05.03.2013, 21:51
например, так:
T-SQL
1
select ( <тут запрос №1> )-( <тут запрос №2> )
0
1 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 41
05.03.2013, 22:21  [ТС]
pincet, Простите, не совсем поняла Вашего вопроса? Причём здесь схема данных?

cygapb-007, В самом последнем коде написано как Вы предложили. Но работает некорректно.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
06.03.2013, 00:02
в первом и втором запросах есть группировка, в третьем группировок в скобках нет - может поэтому неверно считает?
0
1 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 41
06.03.2013, 12:14  [ТС]
cygapb-007,
Если добавить группировку, то выдаёт ошибку: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Если после каждого SELECT в подзапросах добавить TOP 1, тоже что-то не то считает.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.03.2013, 12:53
rviktoria, в ваших подзапросах нужна не группировка, а фильтр. В смысле, во WHERE в каждом подзапросе указывайте даты, за которые нужна сумма.

Добавлено через 4 минуты
Хотя лучше вообще запрос координально переписать. Как-нибудь вот так:
T-SQL
1
2
3
4
5
6
7
SELECT     CONVERT(VARCHAR, DATEADD(s, nb.TEreport.DATA, 25568), 102) AS Dat,
            SUM(CASE WHEN LEFT(nb.TEprovider.name, 9) != 'СО СКЛАДА' THEN 1 WHEN SUBSTRING(nb.TEnitka.name, 5, 8) != 'на склад' THEN -1 ELSE 0 END * nb.TEreport.ves_vesi)
FROM nb.TEreport INNER JOIN nb.TEnitka ON nb.TEreport.id_nitka = nb.TEnitka.id
WHERE     CONVERT(VARCHAR, DATEADD(s, nb.TEreport.DATA, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102)
          AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.DATA, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.DATA, 25568), 102)
ORDER BY Dat ASC
1
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
06.03.2013, 13:25
Цитата Сообщение от rviktoria Посмотреть сообщение
cygapb-007,
Если добавить группировку, то выдаёт ошибку: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Если после каждого SELECT в подзапросах добавить TOP 1, тоже что-то не то считает.
раз каждый селект выдает кучу строк, то надо использовать такую конструкцию:
SQL
1
2
3
SELECT p.поле-v.поле AS разность
FROM(<первый запрос>)p
JOIN(<второй запрос>)v ON v.<что-то>=p.<что-то>
1
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
06.03.2013, 14:07
Схема данных - наше все.
Если бы у вас движения по складу были реализованы верно, никаких "разностей запросов" не нужно
Посмотрите, как реализованы движения по регистрам в 1с 7.7
0
1 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 41
06.03.2013, 17:00  [ТС]
Решение найдено! Вопрос закрыт. Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2013, 17:00
Помогаю со студенческими работами здесь

Язык запросов SQL
Кто поможет разобраться: как сделать вот это то есть реализовать 1. Язык запросов SQL: Создание БД и Таблиц. Примеры 2. Язык запросов...

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

Создание запросов в MS SQL
Всем Привет. Помогите, пож-та усовершенствовать запрос. (исключить повторения.) есть таблица Taksit CREATE TABLE ( INT ...

Составление запросов SQL
Ребят,выручайте. Изучаю язык SQL, дали задание написать запросы Представьте 2 таблицы: A-справочник подразделений (ИД подразделения ...

Объединение sql запросов
Всем привет. У меня есть 2 таблицы (Expences, Profit) такого формата: Expences ID Date1 Summa Profit


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru