sql server—获取sql中某个时间段之间的记录的替代方法(计算会计年度)

sbtkgmzw  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(383)

这个问题在这里已经有答案了

在sql select语句中计算会计年度(10个答案)
9个月前关门了。
我有这个表,我写了,创建表查询和示例数据如下:

  1. DECLARE @TCS_DIVIDEND_PER_YEAR TABLE
  2. (RECORD_DATE DATE,
  3. DIVIDENDPERSHARE INT)
  4. INSERT INTO @TCS_DIVIDEND_PER_YEAR values
  5. ('07/16/20',5)
  6. ,('06/03/20', 6)
  7. ,('03/19/20', 12)
  8. ,('01/23/20', 5)
  9. ,('10/17/19', 5)
  10. ,('10/17/19', 40)
  11. ,('07/16/19', 5)
  12. ,('06/04/19', 18)
  13. ,('01/17/19', 4)
  14. ,('10/23/18', 4)
  15. ,('07/17/18', 4)
  16. ,('05/31/18', 29)
  17. ,('01/22/18', 7)
  18. ,('10/25/17', 7)
  19. ,('07/24/17', 7)
  20. ,('06/13/17', 27.5)
  21. ,('01/23/17', 6.5)
  22. ,('10/24/16', 6.5)
  23. ,('07/25/16', 6.5)
  24. ,('06/06/16', 27)
  25. ,('01/21/16', 5.5)
  26. ,('10/23/15', 5.5)
  27. ,('07/20/15', 5.5)
  28. ,('06/05/15', 24)
  29. ,('01/27/15', 5)
  30. ,('10/29/14', 5)
  31. ,('07/28/14', 5)
  32. ,('07/28/14', 40)
  33. ,('06/06/14', 20)
  34. ,('01/27/14', 4)
  35. ,('10/25/13', 4)
  36. ,('07/29/13', 4)
  37. ,('06/06/13', 13)
  38. ,('01/23/13', 3)
  39. ,('10/31/12', 3)
  40. ,('07/23/12', 3)
  41. ,('06/07/12', 8)
  42. ,('06/07/12', 8)
  43. ,('01/25/12', 3)
  44. ,('10/25/11', 3)
  45. ,('07/28/11', 3)
  46. ,('06/08/11', 8)
  47. ,('01/27/11', 2)
  48. ,('11/01/10', 2)
  49. ,('07/29/10', 2)
  50. ,('06/15/10', 4)
  51. ,('06/15/10', 10)
  52. ,('01/27/10', 2)
  53. ,('10/28/09', 2)
  54. ,('07/27/09', 2)
  55. ,('06/16/09', 5)
  56. ,('01/28/09', 3)
  57. ,('10/29/08', 3)
  58. ,('07/31/08', 3)
  59. ,('06/18/08', 5)
  60. ,('01/23/08', 3)
  61. ,('10/22/07', 3)
  62. ,('07/27/07', 3)

我想得到 sum(DIVIDENDPERSHARE) 在每个财政年度之间,即3月31日至4月1日,所有记录
例如,2007财年2007年3月31日至2008年4月1日期间的股息总额将为9,这应该对所有记录进行迭代。
以下代码确实有效:

  1. DECLARE @STARTDATE DATE
  2. DECLARE @ENDDATE DATE
  3. SET @STARTDATE = '04/01/2007'
  4. SET @ENDDATE = '03/31/2008'
  5. WHILE YEAR(@ENDDATE) <= YEAR(GETDATE())
  6. BEGIN
  7. SELECT SUM(DIVIDENDPERSHARE) AS DIVIDEND, @STARTDATE AS STARTING_DATE, @ENDDATE AS ENDING_DATE FROM
  8. @TCS_DIVIDEND_PER_YEAR
  9. WHERE RECORD_DATE BETWEEN @STARTDATE AND @ENDDATE
  10. Set @STARTDATE = DATEADD(YYYY,1, @STARTDATE)
  11. SET @ENDDATE = DATEADD(YYYY, 1, @ENDDATE)
  12. IF @@ROWCOUNT = 0
  13. BREAK;
  14. END

输出为

  1. (58 rows affected)
  2. DIVIDEND STARTING_DATE ENDING_DATE
  3. ----------- ------------- -----------
  4. 9 2007-04-01 2008-03-31
  5. (1 row affected)
  6. DIVIDEND STARTING_DATE ENDING_DATE
  7. ----------- ------------- -----------
  8. 14 2008-04-01 2009-03-31
  9. (1 row affected)
  10. DIVIDEND STARTING_DATE ENDING_DATE
  11. ----------- ------------- -----------
  12. 11 2009-04-01 2010-03-31
  13. (1 row affected)
  14. DIVIDEND STARTING_DATE ENDING_DATE
  15. ----------- ------------- -----------
  16. 20 2010-04-01 2011-03-31
  17. (1 row affected)
  18. DIVIDEND STARTING_DATE ENDING_DATE
  19. ----------- ------------- -----------
  20. 17 2011-04-01 2012-03-31
  21. (1 row affected)
  22. DIVIDEND STARTING_DATE ENDING_DATE
  23. ----------- ------------- -----------
  24. 25 2012-04-01 2013-03-31
  25. (1 row affected)
  26. DIVIDEND STARTING_DATE ENDING_DATE
  27. ----------- ------------- -----------
  28. 25 2013-04-01 2014-03-31
  29. (1 row affected)
  30. DIVIDEND STARTING_DATE ENDING_DATE
  31. ----------- ------------- -----------
  32. 75 2014-04-01 2015-03-31
  33. (1 row affected)
  34. DIVIDEND STARTING_DATE ENDING_DATE
  35. ----------- ------------- -----------
  36. 39 2015-04-01 2016-03-31
  37. (1 row affected)
  38. DIVIDEND STARTING_DATE ENDING_DATE
  39. ----------- ------------- -----------
  40. 45 2016-04-01 2017-03-31
  41. (1 row affected)
  42. DIVIDEND STARTING_DATE ENDING_DATE
  43. ----------- ------------- -----------
  44. 48 2017-04-01 2018-03-31
  45. (1 row affected)
  46. DIVIDEND STARTING_DATE ENDING_DATE
  47. ----------- ------------- -----------
  48. 41 2018-04-01 2019-03-31
  49. (1 row affected)
  50. DIVIDEND STARTING_DATE ENDING_DATE
  51. ----------- ------------- -----------
  52. 85 2019-04-01 2020-03-31
  53. (1 row affected)

有没有其他方法来做这件事,不使用额外的表格,如日历表和给定的信息,如果有请分享我想学习

qcbq4gxm

qcbq4gxm1#

你其实不需要日历表。如果会计年度从4月1日开始,您可以减去3个月并提取年度:

  1. SELECT v.FiscalYear, SUM(dpy.DIVIDENDPERSHARE),
  2. DATEFROMPARTS(v.FiscalYear, 4, 1) as StartFiscalYear,
  3. DATEFROMPARTS(v.FiscalYear, 3, 31) as EndFiscalYear
  4. FROM TCS_DIVIDEND_PER_YEAR dpy CROSS APPLY
  5. (VALUES (YEAR(DATEADD(MONTH, -3, dpy.RECORD_DATE)))) v(FiscalYear)
  6. GROUP BY v.fiscalYear;

这应该比使用日历表快得多。

idv4meu8

idv4meu82#

如果您还没有日历表,请创建一个日历表。确保列中有财政年度。然后可以通过一个非常简单的查询来解决这个问题:

  1. SELECT ct.FiscalYear,sum(div.DIVIDENDPERSHARE),min(ct.FullDate) as StartFiscalYear,max(ct.FullDate) as EndFiscalYear
  2. FROM CalendarTable ct
  3. LEFT JOIN TCS_DIVIDEND_PER_YEAR div
  4. ON ct.FullDate = div.RECORD_DATE
  5. GROUP BY ct.fiscalYear

相关问题