Остатки субсидий в ПФХД и импорт Excel-еваских таблиц в SQL-сервер
Получить остатки по субсидиям достаточно легко. Надо в базе 2018 года запустить вот такое:
SELECT TOP (100) PERCENT K_UL_1.NUL AS NUL_P, dbo.K_UL.NUL, SUM(dbo.CSUB_CUL_PFEA.SUMM) AS summ
FROM dbo.DOC RIGHT OUTER JOIN
dbo.K_PR RIGHT OUTER JOIN
dbo.CSUB_CUL_PFEA LEFT OUTER JOIN
dbo.K_ITEM ON dbo.CSUB_CUL_PFEA.K_ITEMID = dbo.K_ITEM.K_ITEMID ON dbo.K_PR.K_PRID = dbo.CSUB_CUL_PFEA.K_PRID ON
dbo.DOC.DOCID = dbo.CSUB_CUL_PFEA.DOCID LEFT OUTER JOIN
dbo.K_UL_K_UL ON dbo.CSUB_CUL_PFEA.K_UL_K_ULID = dbo.K_UL_K_UL.K_UL_K_ULID RIGHT OUTER JOIN
dbo.K_UL ON dbo.K_UL_K_UL.K_ULID = dbo.K_UL.K_ULID LEFT OUTER JOIN
dbo.K_UL AS K_UL_1 ON dbo.K_UL_K_UL.K_ULID_PARENT = K_UL_1.K_ULID
WHERE (dbo.K_PR.K_BKID = 54) AND (SUBSTRING(dbo.K_ITEM.CITEM, 1, 2) = '12') AND (dbo.CSUB_CUL_PFEA.TYPE_PLAN = 3)
GROUP BY K_UL_1.NUL, dbo.K_UL.NUL, dbo.K_PR.K_BKID
ORDER BY dbo.K_UL.NUL, NUL_P
… и получатся остатки (dbo.CSUB_CUL_PFEA.TYPE_PLAN = 3) по типу СИЦ (12xx):
http://akostina76.ucoz.ru/blog/2018-08-05-5273
на 2018 год (dbo.K_PR.K_BKID = 54). Они же, по идее должны возникнуть по итогам 2017-го:
http://akostina76.ucoz.ru/blog/2018-08-11-5288
Получу я в результате выполнения этого запроса такой список:
Но не руками же мне сопоставлять эти суммы. Теоретически можно всё это выбрать и объединить сразу в SQL-сервере. Но по некоторым причинам не лень так делать. Никто же не заставляем меня делать всё одним инструментом. Вполне могу делать так чтобы поменьше думать. Так и сделаю. Я загоню оба списка (СГЗ и СИЦ) в тот же Excel-евский файл, в котором у меня приходы и уходы денег (на отдельные листы).
Потом импортирую всё это в отдельные таблицы какой-то базы SQL-сервера и свяжу их по названию учреждений.
Импорт запускается по правой кнопке на названии базы:
Источник, естественно, Excel, когда он выбран можно выбрать файл:
Дальше выбор базы, куда будет заливаться информация. По-умолчанию та, на которой был запущен импорт:
Так:
Здесь:
… я отмечаю галками только те листы, которые хочу импортировать и пишу справа те названия таблиц которые должны быть созданы для этой информации. Если нажать Next – запустится импорт.
Вот у меня создались и заполнились эти таблицы.
Теперь надо их связать. Вот так это делается:
SELECT TOP (100) PERCENT (CASE WHEN dbo.SGZ.NUL IS NULL THEN OSGZ_18.NUL_P ELSE dbo.SGZ.NUL END) AS nul_p,
(CASE WHEN dbo.SGZ.NUL1 IS NULL THEN OSGZ_18.NUL ELSE dbo.SGZ.NUL1 END) AS nul,
SNULL(dbo.SGZ.Разн, 0) AS Ost,
ISNULL(dbo.OSGZ_18.summ, 0) AS Pfhd,
ISNULL(dbo.SGZ.Разн, 0) - ISNULL(dbo.OSGZ_18.summ, 0) AS razn
FROM dbo.SGZ FULL OUTER JOIN
dbo.OSGZ_18 ON dbo.SGZ.NUL = dbo.OSGZ_18.NUL_P AND dbo.SGZ.NUL1 = dbo.OSGZ_18.NUL
ORDER BY dbo.OSGZ_18.NUL_P, dbo.SGZ.NUL
Тут довольно необычная связь между таблицами (FULL OUTER JOIN), показанная в конструкторе квадратиками, которые, на самом деле две встречные стрелочки.
Я вовсе не уверена, что в том и другом списке есть все учреждения. У кого-то может быть только ПФХД, а у кого-то только расчётный остаток. Может это и ошибка и так быть не должно, но ситуация такая в данных возможна.
INNER JOIN – объединение только тех строк, которые есть и в той и в другой таблице.
LEFT JOIN – выборка всех строк из левой таблицы и присоединение к ним строк правой таблицы (всех, которые есть)
RIGHT JOIN – аналогично, но наоборот
FULL JOIN – выборка всех строк из таблиц и связывание тех, которые связываются.
Строки без пары содержат значения NULL вместо информации. Чтобы с этим справиться используется CASE для названий и IsNull() для сумм. Просто для разнообразия, это два метода дающие результат.
https://drive.google.com/file/d/1YjL6e9Qsf4yNJIiScn9Kjfthj4lRaM6r/view?usp=sharing
У меня не самая свежая база за 2018 год, но по идее эти цифры уже 1 января должны быть известны. Отклонения там есть, конечно. Причём довольно загадочные. Вот, пожалуйста:
А вот так оно возникло:
Больше всего похоже на ситуацию, когда на счете нашли деньги, долго думали, откуда они взялись и предположили, что с СГЗ пошлых лет (потому туда и засунули). Но я просто не знаю, как такое возникает.
|