在proc sql中,当使用SELECT*和GROUP BY时,结果不会折叠
当将星号与sum和group组合使用时,重复项不会像我预期的那样被删除(例如在mysql中): 返回的数据是:在proc sql中,当使用SELECT*和GROUP BY时,结果不会折叠,sql,sas,Sql,Sas,当将星号与sum和group组合使用时,重复项不会像我预期的那样被删除(例如在mysql中): 返回的数据是: col1 | country | s -------------------- 5 | sweden | 25 20 | sweden | 25 30 | denmark | 30 而不是我所期望的: col1 | country | s ------------------------ 5 | sweden | 25 30 | denmark | 30
col1 | country | s
--------------------
5 | sweden | 25
20 | sweden | 25
30 | denmark | 30
而不是我所期望的:
col1 | country | s
------------------------
5 | sweden | 25
30 | denmark | 30
如果不使用星号(*),则返回的数据与我预期的一样
SELECT country, sum(col1) as s from table
您是正确的,当语句中的变量不在GROUP BY语句中时,SAS不会崩溃。 日志中会有一个关于合并数据的注释 如果您只需要这些变量,很遗憾,您必须列出它们,但由于您必须按组列出它们,因此这本身并不是额外的工作 不同的SQL实现处理事情的方式不同,这是SAS不同的一种方式。但是,当您确实希望将摘要统计数据与主数据集合并时,它非常方便 如果您不希望出现这种行为,请将NOREMERGE选项添加到PROC SQL中,但它会抛出一个错误,仍然无法按您希望的方式工作。
您是正确的,当语句中的变量不在GROUP BY语句中时,SAS不会崩溃。 日志中会有一个关于合并数据的注释 如果您只需要这些变量,很遗憾,您必须列出它们,但由于您必须按组列出它们,因此这本身并不是额外的工作 不同的SQL实现处理事情的方式不同,这是SAS不同的一种方式。但是,当您确实希望将摘要统计数据与主数据集合并时,它非常方便 如果您不希望出现这种行为,请将NOREMERGE选项添加到PROC SQL中,但它会抛出一个错误,仍然无法按您希望的方式工作。
永远不要使用
选择*
。这是坏习惯,有风险,不可持续。。。读一读
什么样的SQL
您的第一个查询不应该起作用。你基本上是说
select col1
, country
, sum(col1) as s
from table
group by country
…将返回一个错误:
列“table.col1”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
SELECT country, sum(col1) as s from table
…也不应该起作用:
列“table.country”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。
SELECT country, sum(col1) as s from table
考虑到你的预期产出,我怀疑你想要的是
select min(col1) as col1
, country
, sum(col1) as s
from table
group by country
永远不要使用
选择*
。这是坏习惯,有风险,不可持续。。。读一读
什么样的SQL
您的第一个查询不应该起作用。你基本上是说
select col1
, country
, sum(col1) as s
from table
group by country
…将返回一个错误:
列“table.col1”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
SELECT country, sum(col1) as s from table
…也不应该起作用:
列“table.country”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。
SELECT country, sum(col1) as s from table
考虑到你的预期产出,我怀疑你想要的是
select min(col1) as col1
, country
, sum(col1) as s
from table
group by country
为什么
col1
输出需要10
?当您sum(col1)
是输出25
而不是50
时,如何计算。对于不是通过函数(如sum()
或在GROUP by
子句中聚合的列,您有什么期望?如果列出现在您的选择中,它必须以某种方式显示该数据,无论是显式命名还是在使用*
时。如果您共享此表中的示例数据和所需的结果(执行正确的计算),以便我们可以帮助编写您需要的SQL,可能会有所帮助。oups,我的错误。在COL1中,我不是指10,我确定。你可能要考虑<代码> PROC单变量,<代码> FRQ或<代码>意味着如果你想计算很多不同的数字组合中的许多不同的数字度量的聚合结果。为什么你期望得到COL1的5?为什么不是20?为什么您希望col1
输出为10
?当您sum(col1)
是输出25
而不是50
时,如何计算。对于不是通过函数(如sum()
或在GROUP by
子句中聚合的列,您有什么期望?如果列出现在您的选择中,它必须以某种方式显示该数据,无论是显式命名还是在使用*
时。如果您共享此表中的示例数据和所需的结果(执行正确的计算),以便我们可以帮助编写您需要的SQL,可能会有所帮助。oups,我的错误。在COL1中,我不是指10,我确定。你可能要考虑<代码> PROC单变量,<代码> FRQ或<代码>意味着如果你想计算很多不同的数字组合中的许多不同的数字度量的聚合结果。为什么你期望得到COL1的5?为什么不是20?但是数据集有数百列,我并不想按它们分组(它们在相关组的所有行上包含相同的数据…)。但是如果我理解正确的话,我就没有命名列的选项,而且只能命名两次…一种方法是使用%varlist(data=)宏,它允许您传递数据集的名称,并返回数据集中以逗号分隔的变量列表,这样,您就不必键入一长串变量。如果它们包含完全相同的数据,则添加distinct
,这将解决您的问题,但是,在您的示例中,您没有完全相同的值,具体来说,col1会跨行更改,因此它不是唯一的。您可以使用proc sql中的FEEDBACK
选项让sa生成变量列表,这样就不必键入变量。将其添加到PROC SQL中并检查日志。但是数据集有数百列,我并不打算按它们分组(它们在相关组中的所有行上包含相同的数据…)。但是如果我理解正确的话,我不知道