繁体   English   中英

如何在计算列上分组?

[英]How do I group by on calculated columns?

假设下表有 3 个数字字段:

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

宽度和高度是以毫米为单位的图像大小。 现在我想创建一个关于按厘米尺寸分组的图像数量的报告。 这意味着我必须对 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 子句中的聚合函数。

简单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 ......,对吧?

以下查询使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM