【问题标题】:SAS Sum daily date into weeksSAS Sum 每日日期到几周
【发布时间】:2021-11-01 06:40:39
【问题描述】:

我正在尝试获取每日数据(并非每天都有数据)并从星期一开始按周求和。下面是我拥有的数据的一个非常小的样本。该代码与此处所需的求和目的无关。

数据有:

ID PKG Revdt code QTY
70 17AB 02AUG2021:00:00:00 01 7
70 17AB 04AUG2021:00:00:00 02 -10
70 17AB 05AUG2021:00:00:00 01 8
70 17AB 10AUG2021:00:00:00 01 7
70 17AB 1QAUG2021:00:00:00 01 7
73 12AC 02AUG2021:00:00:00 09 0
73 17AC 07AUG2021:00:00:00 01 7

需要数据

ID PKG Revdt code QTY
70 17AB 02AUG2021:00:00:00 01 5
70 17AB 09AUG2021:00:00:00 01 14
73 12AC 02AUG2021:00:00:00 01 7

我已经尝试了以下

Proc sql;
    connect to odbc (dsn='' id='' p='');
    create table work.WeeklySum as select distinct * from connection to odbc
         (select ID, Pkg, datepart(week, revdt), code, sum(qty)
             from datebase
             group by datepart(week, revdt) );
disconnect from odbc;
quit;

但是当我运行它时,它说“错误:proc sql 要求任何创建的表至少有 1 列”

【问题讨论】:

  • 运行了吗?你收到错误信息了吗?什么讯息?你得到错误的结果了吗?怎么错了?
  • 对其进行了编辑以包含错误消息“错误:proc sql 要求任何创建的表至少有 1 列”。它正在运行。只是不返回任何东西
  • 您的查询确实有 5 个“列”,但其中两个没有名称。您确定您的 SQL-Server 特定查询有效吗?您可以尝试使用其他连接数据库的方式吗?
  • 所以当我删除 datepart(week, revdt) 并只使用 revdt 时,删除 sum() 并删除组,它会拉入所有数据。所以问题似乎出在添加日期部分时,因为我只使用日期部分而没有太阳但它仍然返回相同的错误
  • intnx 是一个 SAS 函数,所以它肯定不会在那里工作。

标签: sql-server date sas aggregate cumulative-sum


【解决方案1】:

我会先将包含每日行的数据提取到 SAS 中。如果它太大,编写一个宏以小块循环运行它。

将每日数据集导入 SAS 后,创建一个包含每周日期时间的单独表(这里我创建的表从 2021 年 1 月 1 日开始,每周都有一行 - 根据您的需要更改输入) :

data weeks;
format week_date datetime19.;
    do i = 0 to 52; 
    week_date = intnx('dtday', "01jan2021:00:00:00"dt, 7*i,'s');
    output;
    end;
drop i;
run;

获得本周数据集后,请使用以下方法将您的每日数据集加入其中:

week_date <= revdt < intnx('dtday', week_date, 7, 's') 

然后按 week_date 对变量求和。

【讨论】:

    【解决方案2】:
    select ID, Pkg, datepart(week, revdt), code, sum(qty)
                 from datebase
                 group by datepart(week, revdt) 
    

    这在 SQL Server 中无效,因此这将是您的问题。 SAS 允许您这样做,但是当您执行传递 SQL 时,您必须遵循他们的规则。对于 SQL Server,每个不属于汇总函数的变量(这里,sum(qty) 是唯一的汇总函数调用)都必须是分组依据的一部分。

    如果您想在 SQL Server 中进行分组,您必须将查询修改为从 (ID,Pkg) 查询到 (datepart,sum) 查询的连接。 SAS 会为您执行此操作,但 SQL Server 不会。

    【讨论】:

    • 那么我会使用基本的 select 语句/where 子句运行 Pass through 查询,然后有一个子查询将信息转换为周。还是我最好通过查询提取数据,然后使用 SAS 对其进行操作?
    • 由你决定,直通的优点是你通过网络传递的数据少得多;如果这是一张小桌子,那么我只需传递所有数据。如果没有,则在 SQL Server 中执行。如果您可以在公司询问 SQL 人员,他们可能会帮助您制作 SQL 查询。
    • 是的,它是一个巨大的数据库。主要问题是我正在尝试更新一个已经在 sas 上运行的工具,所以我必须通过 SAS 做所有事情。因此,假设我使用 pass through 将所有数据带入,是否有任何好的 sas 函数可以将该日期从 05aug2021:00:00:00 转换为 02aug2021:00:00:00(本周开始 - 星期一) .我尝试搜索它们,日期部分会给我一个看起来不太有用的周数,因为主表上的数据是那个周格式
    • 在 SAS 中做任何事情都很好,但是内部查询在 SQL Server syntax 中 - 所以它必须是可以直接在 SQL Server 中工作的东西,即使你工具本身在 SAS 中运行。我经常打开 SQL Server Management Studio 来解决这样的查询问题——我建议你也这样做。您不能在直通中使用 SAS - 这就是重点!
    猜你喜欢
    • 2019-02-27
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    相关资源
    最近更新 更多