10

假设下表包含 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 的转换,并且会导致相同尺寸的多行。

例如

 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 子句中的聚合函数。

4

3 回答 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行...,对吗?

于 2012-05-01T14:25:45.403 回答
2

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

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

单击此处查看 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
于 2012-05-01T14:45:39.163 回答
0

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

于 2020-10-13T04:54:54.597 回答