2012-05-01 17 views
7

Supongamos la siguiente tabla con 3 campos numéricos:¿Cómo puedo agrupar por columnas calculadas?

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

anchura y la altura son los tamaños de imagen en milímetros. Ahora quiero crear un informe sobre la cantidad de imágenes agrupadas por sus dimensiones en centímetros. Esto significa que tengo que AGRUPAR POR 2 columnas no existentes.

I puede hacer:

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 

pero esto hará el mm a la conversión cm sólo en el nivel de vista y dará lugar a más de una fila para mismas dimensiones.

p. Ej.

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

no va a resultar en 1 categoría

W H A 
-- -- - 
15 16 3 

pero en

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

El motor objetivo es en realidad una base de datos de FileMaker, que por desgracia no parece apoyar las funciones de agregado dentro del grupo Cláusula BY.

Respuesta

5

Simply GROUP BY sus columnas calculadas:

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 

EDIT: Además, por lo que entiendo de su pregunta no desea que el COUNT la SUM de las filas ..., ¿verdad?

+4

+1: O ... Reemplazar 'DE IMAGES' con' FROM (SELECT ROUND (Ancho/10,0) COMO W, REDONDO (Altura/10,0) COMO H, Cantidad DE IMÁGENES) COMO datos'. Luego puede 'SELECCIONAR W, H' y' AGRUPAR POR W, H' y 'ORDEN POR W, H' y saber que todas las referencias a' W, H' siempre se refieren a las columnas derivadas, y no tienen que repetir sus cálculos . – MatBailie

+0

Funciona con mysql pero no con FileMaker.Parece que FileMaker no permite funciones en GROUP BY ni tablas de subconsultas :( – mselbach

+0

@mselbach ¿Se pueden crear variables de tabla en FileMaker? ¿Qué pasa con las tablas temporales? En ese caso, puede tratarse de una operación de dos pasos en la que se crea el dividido primero los valores, luego agréguelos después – Matthew

2

La siguiente consulta usa Common Table Expression (CTE) para convertir el ancho y la altura de mm a cm junto con el redondeo y luego produce una salida de tabla derivada. Esta salida CTE se usa para agrupar los valores de ancho y alto para calcular la SUMA de la columna de cantidad.

no estoy seguro de si estaban buscando SUM de la columna de la cantidad o la COUNT de la columna de cantidad. Supuse SUM según su consulta. Si solo desea COUNT, cambie SUM en la consulta al COUNT.

Click here to view the demo in SQL Fiddle

Guión:

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 

de salida:

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

Gracias por esta solución. Veo que este sería el enfoque con bases de datos sql reales, pero en FileMaker simplemente no funciona. El subconjunto SQL del generador de archivos es demasiado restrictivo :( – mselbach