2012-05-01 19 views
7

supponga la seguente tabella con 3 campi numerici:Come faccio a raggruppare per colonne calcolate?

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

larghezza e l'altezza sono le dimensioni delle immagini in millimetri. Ora voglio creare un rapporto sulla quantità di immagini raggruppate in base alle loro dimensioni in centimetri. Ciò significa che devo GROUP BY 2 colonne non esistenti.

posso fare:

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 

ma questo farà il mm alla conversione cm solo a livello di vista e si tradurrà in più di una riga per stesse dimensioni.

ad es.

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

non determinerà in 1 categoria

W H A 
-- -- - 
15 16 3 

ma in

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

Il motore mirato è in realtà un database FileMaker, che purtroppo non sembra supportare funzioni di aggregazione all'interno del gruppo Clausola BY.

risposta

5

semplicemente GROUP BY le colonne calcolate:

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: Inoltre, da quanto ho capito della tua domanda, non si desidera che il COUNT il SUM delle righe ..., giusto?

+4

+1: O ... Sostituire 'DA IMAGES' con' FROM (SELECT ROUND (Larghezza/10,0) AS W, ROUND (Altezza/10,0) AS H, quantità FROM IMMAGINI) AS dati. Quindi puoi 'SELEZIONARE W, H' e' GROUP BY W, H' e 'ORDER BY W, H' e sapere che tutti i riferimenti a' W, H' fanno sempre riferimento alle colonne derivate e non devono ripetere i calcoli . – MatBailie

+0

Funziona con mysql ma non in FileMaker.Sembra che FileMaker non consenta le funzioni in GROUP BY né le tabelle delle subquery :( – mselbach

+0

@mselbach È possibile creare variabili di tabella in FileMaker? Che dire delle tabelle temporanee? In tal caso, questa operazione potrebbe essere in due passaggi in cui si crea il file diviso prima i valori, poi li aggregiamo in seguito – Matthew

2

La seguente query utilizza Common Table Expression (CTE) per convertire larghezza e altezza da mm a cm insieme all'arrotondamento e quindi produce un'uscita tabella derivata. Questo output CTE viene quindi utilizzato per raggruppare i valori width e height per calcolare SUM della colonna amount.

Non sono sicuro se stavate cercando SUM della colonna quantità o COUNT della colonna quantità. Ho assunto SUM in base alla tua richiesta. Se si desidera solo COUNT, modificare SUM nella query a COUNT.

Click here to view the demo in SQL Fiddle

Script:

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 

uscita:

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

Grazie per questa soluzione, vedo che questo sarebbe l'approccio con i veri database SQL, ma in FileMaker semplicemente non funziona. Il sottoinsieme SQL del filemaker è troppo limitante :( – mselbach

Problemi correlati