Newsgroup: it.comp.appl.access
Titolo: query: select top 10 per ogni cliente

ho le tabelle degli ordini che contengono il codice del cliente 
(cardcode) e il codice del prodotto (itemcode)
 
le tabelle sono ordr e rdr1 (testate e righe)
 
per contare quante volte ogni prodotto è stato ordinato da ogni cliente 
basta poco :
 
select b.cardcode, a.itemcode, count(a.itemcode)
from rdr1 a
inner join ordr b on b.docentry = a.docentry
group by b.cardcode, a.itemcode
order by b.cardcode, count(a.itemcode) desc
 
ora vorrei estrarre solo i top 10 di ogni cardcode ma se lo metto 
subito dopo il select mi restituisce le prime dieci righe che trova
 
come si fa a dirgli di prendere i primi dieci articoli (itemcode) di 
ogni cliente (cardcode)?
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........


Crei una TabellaTMP con il risultato della query che hai scritto
Poi estrai quello che hai bisogno
Ciao
Graziano

 Poi estrai quello che hai bisogno
 
ok, ci proverò, ho un piovoso weekend a disposizione ;o)


Il giorno mercoledì 2 agosto 2023 alle 17:39:34 UTC+2 Ammammata ha scritto:

Così dovrebbe andare
 
SELECT DISTINCT  
    ART.itemcode,
    ORD.cardcode
FROM rdr1 ART
LEFT JOIN ordr ORD
    ON ART.docentry = ORD.docentry
WHERE 
    EXISTS  
    (SELECT TOP 10
        b.cardcode,
        a.itemcode,
        count(a.itemcode) Conteggio_Venduto
    FROM rdr1 a
    LEFT JOIN ordr b 
        ON b.docentry = a.docentry
    WHERE 
        a.itemcode = ART.itemcode AND 
        b.cardcode = ORD.cardcode
    GROUP BY 
        b.cardcode, 
        a.itemcode
    ORDER BY 
        b.cardcode, 
        Conteggio_Venduto DESC) AS Top10

OneEDP formulated the question :

ciao OneEDP
grazie per il codice
 
un paio di note
 
1. ho un errore in fondo:
 
Msg 156, Level 15, State 1, Line 24
Incorrect syntax near the keyword 'AS'.
 
dopo la parentesi di chiusura di EXISTS non gli piace quel AS Top10
se lo tolgo funziona
 
2. non esce il conteggio
il risultato della query (con la modifica qui sopra) è un semplice 
elenco dei codici prodotto e del codice cliente, manca il conteggio dei 
record, qualcosa tipo count(*)
ho provato a metterlo nella query iniziale ma si ferma con un errore:
 
Msg 8120, Level 16, State 1, Line 2
Column 'rdr1.ItemCode' is invalid in the select list because it is not 
contained in either an aggregate function or the GROUP BY clause.
 
ho quindi aggiunto (in coda) una riga
group by ART.itemcode, ORD.cardcode
 
adesso esce il conteggio, ma non è nè ordinato DESC nè tantomeno mi 
tiene buoni solo i primi 10
 
 
detto questo proverò ad arrivarci con una o più tabelle temporanee, 
come suggerito da Graziano



Difficile interpretare i campi e le tabelle che non sono autodescrittive... 
Non hai bisogno di tabelle temporanee. Bisogna confezionare query nidificate.
Assunto che cardcode  sia il codice cliente e itemcode sia il codice articolo dovrebbe funzionare
 
Questa lista restituisce la lista di codici articoli, codici clienti, numero ordini eseguiti per ogni articolo tale che l'articolo per quel cliente risulta tra i top ten venduti
 
SELECT 
    ART.itemcode,
    ORD.cardcode, 
    COUNT(art.itemcode) Conteggio_Ordini
FROM rdr1 ART
LEFT JOIN ordr ORD
    ON ART.docentry = ORD.docentry
WHERE
    EXISTS
    (SELECT TOP 10
        b.cardcode,
        a.itemcode,
        count(a.itemcode) Conteggio_Ordini
    FROM rdr1 a
    LEFT JOIN ordr b
        ON b.docentry = a.docentry
    WHERE
        a.itemcode = ART.itemcode AND
        b.cardcode = ORD.cardcode
    GROUP BY
        b.cardcode,
        a.itemcode
    ORDER BY
        b.cardcode, a.itemcode,
        Conteggio_Ordini DESC) 
GROUP BY
    ART.itemcode,
    ORD.cardcode
 
Daniele