如何在计算列上进行分组?

10
假设有包含3个数字字段的以下表格:
Images (table)
--------------
Width
Height
Amount

Width和Height是以毫米为单位的图像尺寸。现在,我想创建一个报告,根据它们以厘米为单位的尺寸分组图像数量。这意味着我必须按2个不存在的列进行GROUP BY。

我可以这样做:

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

但是这样只会在视图层面上将毫米转换为厘米,导致相同尺寸出现多行。

例如:

 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个回答

8

只需按照计算列进行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,对吗?

4
+1 :或者用 FROM(SELECT ROUND(Width/10,0) AS W, ROUND(Height/10,0) AS H, Amount FROM IMAGES)AS data 替换 FROM IMAGES。然后你可以通过SELECT W,H进行分组,并通过GROUP BY W,HORDER BY W,H 进行排序,并且知道所有对 W,H 的引用始终指的是派生列,而不必重复计算。 - MatBailie
适用于mysql但不适用于FileMaker。看起来FileMaker既不允许GROUP BY中的函数,也不允许子查询中的表。 - mselbach
@mselbach 你能在FileMaker中创建表变量吗?临时表呢?如果是这样的话,可能需要分两步操作,先创建被十分之一除的值,然后再进行聚合。 - Matthew

2
以下查询使用通用表达式(CTE)将宽度和高度从毫米转换为厘米,并进行四舍五入,然后生成一个派生表输出。然后使用这个CTE输出来分组计算宽度和高度值的金额总和
我不确定您是否要求金额总和还是金额数量。根据您的查询,我假设您需要金额总和。如果您只需要金额数量,请将查询中的金额总和更改为金额数量点击此处在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

谢谢提供这个解决方案。我看到这对于真正的 SQL 数据库来说是一个可行的方法,但在 FileMaker 中它就不起作用了。FileMaker 的 SQL 子集限制太多了 :( - mselbach

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接