powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сведение трех таблиц с использованием JOIN и CROSS APPLY
3 сообщений из 3, страница 1 из 1
сведение трех таблиц с использованием JOIN и CROSS APPLY
    #39909600
kukhmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здрасте!

Есть 3 таблицы: Facts, Products, Clients. Задача: рассчитать оборот со скидкой. Если product и tip_clienta в Facts совпадает с product и tip_clienta в Products, а data_pokupki равна na4alo_akcii или data_pokupki сопоставляется с ближайшей меньшей na4alo_akcii - то скидка была - и эта покупка считается.
Решаю задачу в Excel и в SQL Server - получаю разные результаты.
Есть ли ошибки в моей попытке сверстать все в одной таблице в SQL Server 2012?

Запрос выглядит следующим образом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT F.client, A.tip_clienta, F.product, F.data_pokupki, A.na4alo_akcii, F.summa_bez_skidki, A.skidka, (F.summa_bez_skidki-F.summa_bez_skidki*A.skidka/100) AS summa_so_skidkoi
FROM Facts AS F
JOIN Clients AS C
ON F.client = C.naim_clienta AND (F.data_pokupki >= '20140501') AND (F.data_pokupki <= '20140801') -- указание отчетного периода
CROSS APPLY (SELECT TOP(1) P.na4alo_akcii, P.tip_clienta, P.skidka -- выбор единственной даты скидки
FROM Products AS P
WHERE P.product = F.product AND (P.skidka <> 0) AND (C.tip_clienta = P.tip_clienta) AND (F.data_pokupki >= P.na4alo_akcii)
ORDER BY na4alo_akcii DESC) AS A
ORDER BY client, product, data_pokupki; -- сортировка для удобства



Считаю оборот:
Код: sql
1.
SELECT SUM(summa_so_skidkoi) AS oborot_so_skidkoi



Получается: 409606,76 в 848 строках
А в Excel'е: 335306,36 в 683 строках

Прикладываю книгу Excel с входными данными (не знаю, как приложить файл с БД).

Прикладываю книгу Excel с решением.

В сверстанных таблицах Excel и SQL Server разное количество строк (хотя в исходных данных строк в Excel и SQL Server - одинаково), соответственно обороты разные.

В Excel'e уверен больше, но и не могу найти ошибку в SQL-запросе

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
...
Рейтинг: 0 / 0
сведение трех таблиц с использованием JOIN и CROSS APPLY
    #39909679
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kukhmaster, вы пишете:
kukhmaster
Если product и tip_clienta в Facts совпадает с product и tip_clienta в Products

а в cross apply:
Код: sql
1.
P.product = F.product AND (C.tip_clienta = P.tip_clienta)


Почему C.tip_clienta, а не F.tip_clienta?

А если таки C.tip_clienta, то связь F.client = C.naim_clienta какая?
1 к 1 или 1 ко многим, а то тогда для F.client может быть несколько, допустим, разных C.tip_clienta с одним и тем же C.naim_clienta, и вы для каждого изменения C.tip_clienta получаете покупки, которых не было - непонятно без описания таблиц.
PS.файл не смотрел
...
Рейтинг: 0 / 0
сведение трех таблиц с использованием JOIN и CROSS APPLY
    #39909683
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kukhmaster
не знаю, как приложить файл с БД
Выгрузить в текст create table и insert into, ZIP-нуть, приложить.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сведение трех таблиц с использованием JOIN и CROSS APPLY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]