RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 755162
Accepted
Daniyal Lukmanov
Daniyal Lukmanov
Asked:2020-12-07 21:37:09 +0000 UTC2020-12-07 21:37:09 +0000 UTC 2020-12-07 21:37:09 +0000 UTC

如何在 SQL Server 的一个表中获取多年的每周报告

  • 772

有一张表格,其中列出了 5 年指定日期的费用类别和金额。您想要获取整个期间每个类别的每周总计总数。也就是说,在每周结束时,您需要显示该类别的总金额。所有这些都必须以一张表格的形式获得。这就是我卡住的地方。我的脚本将每对值输出为单独的一行表格。脚本如下

DECLARE @i INT = 2; -- Инкремент AccountID
DECLARE @StartDate DATETIME;
DECLARE @EndDate DATETIME;
DECLARE @LastDate DATETIME = (SELECT TOP 1 TransactDate FROM TempTransactions ORDER BY TransactDate DESC);
    WHILE @i <= 3
      BEGIN
        SET @StartDate = '20120101'
        SET @EndDate = '20120107'
        WHILE @EndDate <= @LastDate
          BEGIN
                SELECT S.AccountID, SUM(Baks) As Summa
                FROM (
                SELECT O.TransactDate, O.AccountID, (O.Amount/CONVERT(MONEY, REPLACE(Col2, ',', '.'))) AS Baks 
                FROM (
                SELECT T.AccountID, T.Amount, T.TransactDate, R.Col2 
                FROM TransactsAndRates.dbo.TempTransactions T
                INNER JOIN TransactsAndRates.dbo.Rates R ON T.TransactDate = R.Col1) AS O
                WHERE O.AccountID = @i) AS S
                WHERE S.TransactDate BETWEEN @StartDate AND @EndDate
                GROUP BY S.AccountId
            SET @StartDate = DATEADD(DAY, 7, @StartDate)
            SET @EndDate = DATEADD(DAY, 7, @EndDate)
          END
    SET @i += 1
    END

如何将这些结果垂直“粘合”到一张表中?也许我没有走正确的路。

由于指定的脚本,我得到了很多表格的表格

AccountID |Summa    |
---------------------
2         |237.1244 |

最初,数据取自表格

TransactDate |Amount     |AccountID |
-------------|-----------|----------|
01-01-2012   |11506.0000 |2         |
01-01-2012   |8899.0000  |2         |
02-01-2012   |39.0000    |2         |
03-01-2012   |238.0000   |2         |
04-01-2012   |10023.0000 |2         |
04-01-2012   |565.0000   |2         |
06-01-2012   |357.0000   |2         |
09-01-2012   |10761.0000 |2         |
09-01-2012   |446.0000   |2         |
09-01-2012   |813.0000   |2         |
09-01-2012   |531.0000   |2         |
11-01-2012   |3597.0000  |2         |
12-01-2012   |2068.0000  |2         |
13-01-2012   |10706.0000 |2         |
13-01-2012   |187.0000   |2         |
13-01-2012   |11227.0000 |2         |
14-01-2012   |3019.0000  |2         |
14-01-2012   |969.0000   |2         |
18-01-2012   |1989.0000  |2         |
19-01-2012   |204.0000   |2         |
19-01-2012   |7879.0000  |2         |
20-01-2012   |483.0000   |2         |

期望的结果

StartDate | EndDate  | AccountID |Summa    |
-------------------------------------------
01.07.2012|07.01.2012| 2         |237.1244 |
08.07.2012|15.01.2012| 2         |557.244  |
16.07.2012|23.01.2012| 2         |426.44   |
16.07.2012|23.01.2012| 3         |100.789  |

差不多,但当然更多。

sql
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Mike
    2020-12-07T22:37:27Z2020-12-07T22:37:27Z

    就像是:

    SELECT dateadd(day, (datediff(day, '2012-01-01',TransactDate)/7)*7,'2012-01-01') as StartDate,
           dateadd(day, (datediff(day, '2012-01-01',TransactDate)/7)*7+6,'2012-01-01') as EndDate
            S.AccountID, SUM(Baks) As Summa
       ...
     group by S.AccountID, datediff(day, '2012-01-01',TransactDate)/7
    

    可以稍微调整公式以获得所需一周的正确开始或结束日期。

    PS 如果在您看来您需要一个循环来解决 SQL 中的问题,那么您有 95% 的可能性是从错误的角度看待问题。对于 SQL 允许在没有循环的情况下接收任何部分中的数据,一个请求。

    • 3
  2. Zufir
    2020-12-07T22:51:11Z2020-12-07T22:51:11Z

    使用递归 CTE 获取日期的变体:

    ;WITH cte AS (
    SELECT @startdate AS datebegin, DATEADD(DAY,6,@startDate) dateend
    UNION ALL
    SELECT DATEADD(DAY,1,dateend), DATEADD(DAY, 7, dateend) FROM cte
    WHERE dateend<=@enddate)
    SELECT datebegin, dateend, SUM(t.amount) amount, t.accountId FROM cte
    LEFT JOIN transactions t ON t.TransactionDate BETWEEN datebegin AND dateend
    GROUP BY datebegin, dateend, accountId
    

    在 CTE 中,我们有 7 天的时间,然后加入并分组。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5