总计值和查找前x个值

时间:2012-05-03 20:02:04

标签: sql

情况:

我有一个包含销售记录的数据库,每个记录都有一个ID(PK),ProductCode,Year,Month,SalesVolume。

作为用户,我将指定年份,因此如果我指定1980年,我将在数据库中查询与该年份相对应的所有记录。

我正在尝试创建一个总计指定年份的SalesVolumes月份的查询,然后选择前5个销售量值。

到目前为止我收集到的是以某种方式执行上述操作,然后选择前5个销售量值,按降序排列,并选择前5个,但这就是我所拥有的

请注意,一年内会有多个产品的SalesVolumes:

ID,     Product Code, Year, Month, SalesVolume
23041   121           1980  1      21
23042   121           1980  2      960
23043   121           1980  3      939
23044   121           1980  4      927
23045   121           1980  5      931
23046   121           1980  6      950
23047   121           1980  7      975
23048   121           1980  8      994
23049   121           1980  9      994
23050   121           1980  10     968
23051   121           1980  11     918
23052   121           1980  12     854
23425   122           1980  1      1002
23426   122           1980  2      1032
23427   122           1980  3      1090
23428   122           1980  4      1062
23429   122           1980  5      1010
23430   122           1980  6      1103
23431   122           1980  7      1214
23432   122           1980  8      1122
23433   122           1980  9      1019
23434   122           1980  10     1181
23435   122           1980  11     1343
23436   122           1980  12     1180

预期产出:

1980年

Product Code, SalesVolume
121         , (total SalesVolume of the 12 months)
122         , (total SalesVolume of the 12 months)

1 个答案:

答案 0 :(得分:3)

以下是您可以执行的操作 - 将给定年份的每件商品的销售额总计,对其进行排名,然后选择排名前5位的商品。

SELECT *
FROM (
    SELECT "Product Code",
        SUM(SalesVolume) as total,
        RANK() OVER (ORDER BY SUM(SalesVolume) DESC) as rnk
    FROM YourTable
    WHERE Year = 1980
    GROUP BY "Product Code"
) A
WHERE rnk <= 5

如果您想要选择所有年份的前5名,您也可以这样做:

SELECT *
FROM (
    SELECT Year,
        "Product Code",
        SUM(SalesVolume) as total,
        RANK() OVER (PARTITION BY Year ORDER BY SUM(SalesVolume) DESC) as rnk
    FROM YourTable
    GROUP BY Year, "Product Code"
) A
WHERE rnk <= 5