1 / 1 / 1
Регистрация: 05.03.2013
Сообщений: 41

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

05.03.2013, 16:10. Показов 10270. Ответов 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
1655 / 1154 / 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
1655 / 1154 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru