谁能告诉我如何将 group by 仅用于 3 列? 这是我的桌子(sample1)
|vendorid | storeid | yearid | earnamount |Name |
|---------|---------|--------|-------------|-----|
|1 | 2 | 2007 | 100 | A |
|1 | 2 | 2007 | 150 | C |
|1 | 3 | 2007 | 100 | E |
|2 | 2 | 2008 | 500 | F |
|2 | 2 | 2007 | 200 | H |
|2 | 2 | 2008 | 500 | J |
|3 | 1 | 2007 | 100 | L |
|4 | 4 | 2008 | 230 | N |
我希望我的结果是这样的: 显示结果,Name 列只显示记录中的第一个
|vendorid | storeid | yearid | sum(earnamount) | Name |
|---------|---------|--------|-----------------|------|
|1 | 2 | 2007 | 250 | A |
|1 | 3 | 2007 | 100 | E |
|2 | 2 | 2008 | 1000 | F |
|2 | 2 | 2007 | 200 | H |
|3 | 1 | 2007 | 100 | L |
|4 | 4 | 2008 | 230 | N |
这是我的 sql 命令:
select vendorid, storeid, yearid, sum(earnamount), name
from sample1
group by vendorid,storeid, yearid
不确定下一步是什么。
答案 0 :(得分:0)
如果选择块确实有 GROUP BY 子句,则 SELECT 子句中指定的任何列规范必须专门作为聚合函数的参数出现,或出现在 GROUP BY 子句中给出的列列表中,或同时出现在两者中。 所以在 GROUP BY 中删除 name 或添加 name 列
select vendorid, storeid, yearid, sum(earnamount)
from sample1
group by vendorid,storeid, yearid
或
select vendorid, storeid, yearid, sum(earnamount), name
from sample1
group by vendorid,storeid, yearid,name
答案 1 :(得分:0)
没有“第一”记录,除非一列定义了排序。要执行您想要的操作,您需要在 name
上使用聚合函数。例如:
select vendorid, storeid, yearid, sum(earnamount),
min(name) as name
from sample1
group by vendorid, storeid, yearid;
如果您想要与最小或最大 earnamount
相关联的名称(例如),您可以使用条件聚合:
select vendorid, storeid, yearid, sum(earnamount),
first_name
from (select s1.*,
first_value(name) over (partition by vendorid, storeid, yearid order by earnamount desc) as first_name
from sample1 s1
) s1
group by vendorid, storeid, yearid, first_name;