如何按计算列分组?

时间:2012-05-01 14:22:33

标签: sql group-by

假设下表包含3个数字字段:

Images (table)
--------------
Width
Height
Amount

宽度和高度是以毫米为单位的图像尺寸。现在,我想创建一个关于按厘米分组的图像数量的报告。这意味着我必须使用GROUP BY 2非现有列。

我能做到:

SELECT      ROUND(Width/10,0)   AS W
        ,   ROUND(Height/10,0)  AS H
        ,   SUM(Amount)         AS A 
FROM        IMAGES
GROUP BY    Width
        ,   Height 
ORDER BY    W
        ,   H
        ,   A

但是这只会在视图级别进行mm到cm的转换,并且会为相同的尺寸生成多行。

e.g。

 W   H  A
--- --- - 
150 159 2
150 160 1

不会产生1个类别

W  H  A
-- -- - 
15 16 3

但在

W  H  A
-- -- - 
15 16 2
15 16 1

目标引擎实际上是一个FileMaker数据库,不幸的是,它似乎不支持GROUP BY子句中的聚合函数。

3 个答案:

答案 0 :(得分:6)

只需GROUP BY您计算的列:

SELECT 
    ROUND(Width/10,0) as W
    ,ROUND(Height/10,0) as H
    ,COUNT(*) as A -- You may replace this with SUM(Amount) too
FROM 
    IMAGES
GROUP BY 
    ROUND(Width/10,0)
    ,ROUND(Height/10,0)
ORDER BY 
    W
    ,H
    ,A

编辑另外,根据我对您的问题的理解,您希望COUNT而不是SUM行...,对吗?

答案 1 :(得分:2)

以下查询使用Common Table Expression (CTE)将宽度和高度从mm转换为cm以及舍入,然后生成派生表输出。然后,此CTE输出用于对宽度和高度值进行分组,以计算金额列的总和。

我不确定您是在查找金额列的SUM还是金额列的COUNT。我根据您的查询假设 SUM 。如果您只想 COUNT ,请将查询中的 SUM 更改为 COUNT

Click here to view the demo in SQL Fiddle

脚本

CREATE TABLE images
(
        width   INT     NOT NULL
    ,   height  INT     NOT NULL
    ,   amount  FLOAT   NOT NULL
);

INSERT INTO images (width, height, amount) VALUES
    (150, 159, 1),
    (150, 159, 2),
    (150, 158, 1),
    (150, 159, 3),
    (150, 158, 2),
    (160, 158, 4),
    (160, 158, 1);

;WITH imagesincm AS
(
    SELECT      ROUND(width  / 10,0)    AS W
            ,   ROUND(height / 10,0)    AS H
            ,   amount
    FROM        images
) 
SELECT      W
        ,   H
        ,   COUNT(amount) AS A
FROM        imagesincm
GROUP BY    W
        ,   H 
ORDER BY    W
        ,   H

输出

W  H  A
-- -- - 
15 15 9
16 15 5

答案 2 :(得分:0)

按照正式的FileMaker SQL参考(https://help.claris.com/en/sql-reference.pdf)的第11页,Group By子句仅适用于字段。