Task 13(inc_out)

–A scrap recycling company is examining status of their outlets.

–Assuming each outlet starts with $10000 dollars find the date which is was profitable,

–in case the outlet is not profitable, write the last date an income was recorded.

–To determine the profit of a company we will look at the Outcome_o only and not look at either incomes tables

–or the the outcome table.

–Result set: Outlet ID (point), profitable date (or last working day), profit (or remaining to be profit).

select point, max([date]), MAX(res) 10000 from

(

select x.point, min([date]) date, min(x.res) res from

(select o1.point

, ISNULL( o1.out +

(select SUM(o2.out) from Outcome_o o2 where o1.point = o2.point and o1.date > o2.date ), o1.out) res

, o1.date

from Outcome_o o1) x

where

x.res >= 10000

group

by x.point

union

select

x.point, max([date]) date, max(x.res) from

(select o1.point

, ISNULL( o1.out +

(select SUM(o2.out) from Outcome_o o2 where o1.point = o2.point and o1.date > o2.date ), o1.out) res

, o1.date

from Outcome_o o1) x

where

x.res < 10000

group

by point

)

data

group

by point

forum:

SELECT

oo.Point, MAX(oo.Date) AS MaxDate, (SUM(oo.Out))-10000 AS AchievedSUM

FROM

Outcome_o AS oo

WHERE

NOT EXISTS

(SELECT o1.Point, SUM(o1.Out)

FROM Outcome_o AS o1

WHERE o1.Date < oo.Date

AND o1.Point = oo.Point

GROUP BY o1.Point

HAVING SUM(o1.Out) > 10000)

GROUP

BY oo.Point

–Разбор решения задачи: =))

–Пока внешний запрос перебирает все записи, внутренний запрос для каждого значения даты ‘oo.Date’,
–переданного во внутренний запрос(и для того же самого пункта приема ‘o1.Point = oo.Point’),
–суммирует все записи о выдаче средств (до даты ‘oo.Date’) и определяет: было ли выполнено условие
–(1)  20.000 – SUM(Out) + 2*SUM(Out) > 30.000, равносильное
—                               SUM(o1.Out) > 10000
–И если это условие было выполнено, то это означает, что на дату ‘oo.Date’, пункт ‘oo.Point’
–Выполнил свою задачу.
–Но в нашем случае, я использую ‘NOT EXISTS’ и условие ‘o1.Date < oo.Date’, т.к. мне важно, чтобы
–во внешнем запросе были отобраны только те записи, для которых условие (1) еще не выполнено.
–Тут нужно обратить внимание на то, что дату я беру "не включительно", это позволяет сделать так,
–что дата выполнения обязательства, наступления события (1) гарантированно попала во внешний запрос,
–Но если событие (1) так и не наступило, то записи попадут все (это важно для неуспешных пунктов).

–Так, теперь, после обработки всех внутренних запросов, но еще до выполнения оператора ‘GROUP BY oo.Point’,
–мы имеем в полученной таблице записи:
–а) Для успешных пунктов – все записи вплоть до даты выполнения обязательства(включительно)
–б) Для неуспешных пунктов – вообще все записи.

–А далее – очевидно, просто агрегируем по пунктам приема: ‘GROUP BY oo.Point’,
–находя при этом максимальную дату (выполнения или невыполнения (1)) и общую вырученную сумму
–к последней дате в полученной таблице минус 10.000.
–Это условие по-сути равносильно (1) и является ответом на вопрос задачи:
— Для пунктов, справившихся с заданием, определить дату его выполнения и сумму денежных средств,
— полученных сверх плана на эту дату;
— Для пунктов, которые не справились с заданием, определить на последнюю отчетную дату
— сумму денежных средств, недостающих до его выполнения.
 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s