Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом СРОЧНО  [new]
Rovshan1975
Member

Откуда:
Сообщений: 41
Есть таблица Продажа с полями Код_Товара, Имя_Товара, Кол-во_Товара, Тип_Фактуры.. Имееться 4 типа фактур: 1-розница, 2-оптовая, 3-возврат с розницы, 4-возврат с опта... Нужно составить запрос в следующей форме:

Код_Товара Имя_Товара Розница Оптовая

Сумма продаж по каждому из типов фактур должна быть с учетом вычета возврата. Т.е. 1-3=розница и 2-4=оптовая
8 сен 11, 11:29    [11245976]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
SELECT Код_Товара, Имя_Товара, 
SUM(CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара) AS Розница,
SUM(CASE Тип_Фактуры WHEN 2 THEN 1 WHEN 4 THEN -1 ELSE 0 END * Кол-во_Товара) AS Оптовая
FROM Продажа
GROUP BY Код_Товара, Имя_Товара
8 сен 11, 11:39    [11246070]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
Rovshan1975
Member

Откуда:
Сообщений: 41
Огромное спасибо ВАМ!
8 сен 11, 11:48    [11246147]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
Rovshan1975
Member

Откуда:
Сообщений: 41
А если нужно будет суммарно по прошлому месяцу и за 3 месяца?
8 сен 11, 11:51    [11246174]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
SELECT Код_Товара, Имя_Товара, 
SUM(CASE WHEN MONTH(Дата) = MONTH(GETDATE())-1 THEN 
	CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара
	END) AS Месяц_Розница,
SUM(CASE WHEN MONTH(Дата) = MONTH(GETDATE())-1 THEN 
	CASE Тип_Фактуры WHEN 2 THEN 1 WHEN 4 THEN -1 ELSE 0 END * Кол-во_Товара
    END) AS Месяц_Оптовая,	
SUM(CASE WHEN MONTH(Дата) >= MONTH(GETDATE())-2 THEN 
	CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара
	END) AS Три_Месяц_Розница,
SUM(CASE WHEN MONTH(Дата) >= MONTH(GETDATE())-2 THEN 
	CASE Тип_Фактуры WHEN 2 THEN 1 WHEN 4 THEN -1 ELSE 0 END * Кол-во_Товара
    END) AS Три_Месяц_Оптовая
	
FROM Продажа
GROUP BY Код_Товара, Имя_Товара


вместо этого кода
WHEN MONTH(Дата) >= MONTH(GETDATE())-2
возможно нужно использовать код ниже. Все зависит от условий задачи.
WHEN MONTH(Дата) BETWEEN MONTH(GETDATE())-3 AND MONTH(GETDATE())-1

В решении не учтен год YEAR(Дата). Т.е. когда Вы в феврале хотите получить данные за ноябрь, декабрь и январь.
Для остальных случаев будет работать.
8 сен 11, 12:48    [11246722]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
trew
SELECT Код_Товара, Имя_Товара, 
SUM(CASE WHEN MONTH(Дата) = MONTH(GETDATE())-1 THEN 
	CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара
	END) AS Месяц_Розница,
SUM(CASE WHEN MONTH(Дата) = MONTH(GETDATE())-1 THEN 
	CASE Тип_Фактуры WHEN 2 THEN 1 WHEN 4 THEN -1 ELSE 0 END * Кол-во_Товара
    END) AS Месяц_Оптовая,	
SUM(CASE WHEN MONTH(Дата) >= MONTH(GETDATE())-2 THEN 
	CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара
	END) AS Три_Месяц_Розница,
SUM(CASE WHEN MONTH(Дата) >= MONTH(GETDATE())-2 THEN 
	CASE Тип_Фактуры WHEN 2 THEN 1 WHEN 4 THEN -1 ELSE 0 END * Кол-во_Товара
    END) AS Три_Месяц_Оптовая
	
FROM Продажа
GROUP BY Код_Товара, Имя_Товара


вместо этого кода
WHEN MONTH(Дата) >= MONTH(GETDATE())-2
возможно нужно использовать код ниже. Все зависит от условий задачи.
WHEN MONTH(Дата) BETWEEN MONTH(GETDATE())-3 AND MONTH(GETDATE())-1

В решении не учтен год YEAR(Дата). Т.е. когда Вы в феврале хотите получить данные за ноябрь, декабрь и январь.
Для остальных случаев будет работать.
Вот так не надо делать никогда.
Накладывать условия на функцию от поля - значит отказываться от использования каких бы то ни было индексов по этому полю.
8 сен 11, 12:55    [11246769]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
Rovshan1975
Member

Откуда:
Сообщений: 41
Спасибо за помощь... Есть одно НО... Кол-во продаж не совпадает с отчетом самой программы... Может быть в запросе где-то пропуск?
8 сен 11, 13:10    [11246882]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Поищите ошибку.

Ниже вспомогательный код
SELECT Код_Товара, Имя_Товара, 
	CASE Тип_Фактуры WHEN 1 THEN 1 WHEN 3 THEN -1 ELSE 0 END * Кол-во_Товара as test
FROM Продажа
WHERE Дата BETWEEN Дата_начала AND Дата_окончания

Меняйте в запросе Тип_Фактуры и сверяйте суммы.
SELECT Код_Товара, Имя_Товара, SUM(Кол-во_Товара) as test
FROM Продажа
WHERE Тип_Фактуры =1 AND Дата BETWEEN Дата_начала AND Дата_окончания
GROUP BY Код_Товара, Имя_Товара

iap
автор
Накладывать условия на функцию от поля - значит отказываться от использования каких бы то ни было индексов по этому полю.

Подскажите как нужно? Через временную таблицу?
8 сен 11, 14:10    [11247467]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
trew
Подскажите как нужно? Через временную таблицу?


Дата<=DATEADD(...
8 сен 11, 14:15    [11247514]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
Rovshan1975
Member

Откуда:
Сообщений: 41
Все получилось! По ходу моя ошибка была....
Можно ли в между каждым CASE вставить условие where Clientref='5'
8 сен 11, 15:06    [11248109]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Rovshan1975,
автор
Можно ли в между каждым CASE вставить условие where Clientref='5'

CASE WHEN a=2 AND b=4 THEN 'тест' END
8 сен 11, 15:35    [11248492]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом СРОЧНО  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
trew
Подскажите как нужно? Через временную таблицу?
WHEN Дата>=DATEADD(MONTH, DATEDIFF(MONTH,0, CURRENT_TIMESTAMP)-3,0)
 AND Дата< DATEADD(MONTH, DATEDIFF(MONTH,0, CURRENT_TIMESTAMP)  ,0)
8 сен 11, 15:39    [11248541]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить