|
Помогите с запросом
#39797912
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Мне нужно реализовать непростую логику в ms sql .
Вкратце, нужно вычислить долю постоянных расходов по проекту помесячно и воздействовать этой долей на накладные статьи расходов. Для формирования отчета Доходов и расходов по проекту
Как это вообще сделать возможно, хоть путь подскажите.
Сейчас такая ХП вытаскивает все прямые расходы и доходы по статьям помесячно
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
ALTER PROCEDURE [dbo].[getFinPLmonthDirectProekt]
@proekt nvarchar(50)
AS
begin
SET NOCOUNT ON;
;WITH mm(a) AS
(
SELECT number FROM master..spt_values WHERE type = 'p'
), grp AS
(
SELECT
OriginFrom = [project].dataS,
OriginInto =[project]. dataPo,
[dataS] =
CASE
WHEN b.a = 0
THEN [project].dataS
ELSE CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(month,b.a,[project].dataS)), 0) as date)
END,
[dataPo] =
CASE
WHEN EOMONTH(DATEADD(month,b.a,[project].dataS)) > [project].dataPo
THEN [project].dataPo
ELSE EOMONTH(DATEADD(month,b.a,[project].dataS))
END,
exp ,
[nds],
A.[tip],
[vid],
[finBookProject].nomDoc,
[finBookProject].summa,
[analitiki].name as expName,
[analitiki].tipPL,
[analitiki].tipText
FROM [finBook] AS A
Left JOIN
[finBookProject] ON A.operation = [finBookProject].operation and A.nomDoc = [finBookProject].nomDoc INNER JOIN
[project] ON [finBookProject].projectKod = [project].kod and [project].actualnost=1
INNER JOIN
mm AS b
ON b.a <= DATEDIFF(month,0,[project].dataPo) - DATEDIFF(month,0,[project].datas)
INNER JOIN
[analitiki] ON exp=[analitiki] .[kod]
WHERE A.actualnost=1 and A.tip<2 and [project].kod=@proekt
)
SELECT
CONVERT(INT, CONVERT(DATETIME,DATEADD(month, DATEDIFF(month, 0, dataS), 0))) as PLmonth,
months.nameMonth,
exp,
[tip],
[vid],
expName,
tipPL,
tipText,
SUM (CAST(ROUND(1.* summa/(100+nds)*100 * (1 + DATEDIFF(day,dataS,DataPo)) /(1 + DATEDIFF(day,OriginFrom,OriginInto)),2) as money)) as value
--,nomDoc,OriginFrom, OriginInto, summaZakrit/(100+nds)*100
FROM grp INNER JOIN
months ON months.firtstDay=DATEADD(month, DATEDIFF(month, 0, dataS), 0)
GROUP BY expName, CONVERT(INT, CONVERT(DATETIME,DATEADD(month, DATEDIFF(month, 0, dataS), 0))), nameMonth,exp,tip,[vid], tipPL, tipText, DATEADD(month, DATEDIFF(month, 0, dataS), 0)
--,nomDoc,OriginFrom,OriginInto, summaZakrit/(100+nds)*100
order by PLmonth
|
|
|