Domanda Tabella campi incrociati raggruppamento per settimane

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
Buongiorno,ho questa query
Visual Basic:
TRANSFORM Count(Sheet1.[Ordine]) AS ConteggioDiOrdine
SELECT Tabella_Difettosita.Descrizione_equipment, Count(Sheet1.[Ordine]) AS [Totale di Ordine]
FROM Sheet1 INNER JOIN Tabella_Difettosita ON Sheet1.[Codice Tipo Impianto] = Tabella_Difettosita.Codice_tipo_impianto
GROUP BY Tabella_Difettosita.Descrizione_equipment
PIVOT Format([Data creazione avviso],"mmm") In ("gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic");
ed è raggruppata per mese, mi occorrerebbe raggruppata per numero della settimana ma ci sto battendo la testa da un po, potete aiutarmi ?
grazie
 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
edit-- dovrei aver risolto cosi
Visual Basic:
TRANSFORM Count([A-qry-PrimoReport].[Ordine]) AS ConteggioDiOrdine
SELECT [A-qry-PrimoReport].[Descrizione_equipment], Count([A-qry-PrimoReport].[Ordine]) AS [Totale di Ordine]
FROM [A-qry-PrimoReport]
WHERE ((([A-qry-PrimoReport].[Data creazione avviso])>=#1/1/2019# And ([A-qry-PrimoReport].[Data creazione avviso])<=#12/31/2019#+1))
GROUP BY [A-qry-PrimoReport].[Descrizione_equipment]
PIVOT [A-qry-PrimoReport].[Week];
che a sua volta la prende da questa query di appoggio
Visual Basic:
SELECT Tabella_Difettosita.Descrizione_equipment, DatePart("ww",[Data creazione avviso]) AS Week, Sheet1.Ordine, Sheet1.[Data creazione avviso]
FROM Sheet1 INNER JOIN Tabella_Difettosita ON Sheet1.[Codice Tipo Impianto] = Tabella_Difettosita.Codice_tipo_impianto
GROUP BY Tabella_Difettosita.Descrizione_equipment, DatePart("ww",[Data creazione avviso]), Sheet1.Ordine, Sheet1.[Data creazione avviso];
pero conteggia la settimana da domenica a sabato, (il 06/01/2019 fa parte della settimana 2), come posso fare ?
 
Ultima modifica:

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
Era una sciocchezza bastava inserire ", 2" dopo DatePart("ww",[Data creazione avviso]),
In questo tread me la sono cantata e suonata e quindi mi metto anche "migliore risposta" :) :) :)
 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
scusate riapro questo tread visto è una settimana che cerco di risolvere un problema legato a questo post.
Il codice sopra va bene ma se non trova dati in una settimana, non la rappresenta.
Ovvero, se ci sono dati, ci sono tutte e 52 le settimane dell'anno, ma ad esempio se c'è un solo dato nella settimana 20, sui campi incrociati ci sarà solo quella settimana, e a me servirebbe che ci siano sempre le canoniche 52 weeks con o senza valori, avete una soluzione ?
P.s. spero di essermi spiegato
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.798
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
328
Ciao. La soluzione è avere una tabella calendario separata, con granularità giornaliera, che comprenda tutte le date incluse nella tabella ordini (ma solo in quell'intervallo, e senza "buchi", quindi ciascuna data deve avere una riga), e che abbia le altre colonne che ti servono, come ad esempio il numero della settimana. La metti poi in left join con la tabella ordini, e tagli la Pivot con i campi della tabella calendario. Non ho bisogno di dirti che usare Access per fare dei report pivot complica e limita le manovre
 
  • Like
Reactions: attila666

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
Grazie klingklang per la risposta,
ho fatto come hai detto ma putroppo funziona solo se i dati da relazionare provengono da tabelle "pure", visto che io uso una query al posto di una tabella il sistema non funziona, e non so perché :(
e considerando che in access non ho tutti i join di sql (un OUTER JOIN sarebbe ideale) la situazione si complica non poco
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.798
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
328
Tabella o Query non dovrebbe fare differenza in realtà. In Access hai 3 join: Inner, Left Outer e Right Outer. Per utilizzare la tecnica che ti ho suggerito devi mettere in Left Outer la tabella Calendario con la tabella (query) Ordini. Sempre che quest'ultima abbia granularità giornaliera! Altrimenti anche Calendario dovrà avere la stessa granularità temporale di Ordini
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.798
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
328
Facendo un po' di "reverse engineering" sul codice SQL che hai pubblicato, supponendo che la tabella Calendario si chiami "Calendario" e le sue colonne significative per te si chiamino "Data" e "Week", potrebbe diventare così:

SQL:
TRANSFORM Count([A-qry-PrimoReport].[Ordine]) AS ConteggioDiOrdine
SELECT
    [A-qry-PrimoReport].[Descrizione_equipment]
  , Count([A-qry-PrimoReport].[Ordine]) AS [Totale di Ordine]
FROM
    [Calendario]
    LEFT OUTER JOIN    [A-qry-PrimoReport]
        ON
            [Calendario].[Data] = [A-qry-PrimoReport].[Data creazione avviso]
WHERE
    [Calendario].[Data]>=#1/1/2019# And
    [Calendario].[Data]<=#12/31/2019#+1
GROUP BY
    [A-qry-PrimoReport].[Descrizione_equipment]
PIVOT
    [Calendario].[Week]
;
 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
con un file di esempio è meglio :) allego db test DB con la query_campiincrociati che evidenzia il problema (è solo un estratto del database) se vedi l'impianto Y_PTM la settimana 40 non ha nulla (allegato1) ma se filtro propio quell'impianto la settimana 40 non la visualizza (allegato2) ma la week con cui effettuo uno degli ordinamenti viene da un'espressione e questo credo complichi le cose.
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.798
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
328
Ciao, ti allego una possibile soluzione senza modificare le tue tabelle, sempre se ho capito lo scopo

 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
il problema è che appena aggiungo una condizione >>WHERE (((Query1.[Codice Tipo Impianto])="y_ptm"))<<
il risultato si riduce solo alle settimane "piene"
 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
avevo il timore di qualcosa del genere, ok ci sbatto per un altro paio di giorni la testa e poi ripiego su una post elaborazione in VBA,
Grazie mille per il tempo che mi hai dedicatoPollicioneInSu
 

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
klingklang @klingklang si lo capisco ma a riuscirci... io non sono molto ferrato in sql, in VBA saprei come fare :)
giulianovac @giulianovac il mio db è Access (al post 9 o il 10 con le query di Kling), per completezza, io esporto dal db di SAP (un programma di manutenzione) in excel e lo importo in Access 2010, da li poi faccio le mie query.
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
2.233
83
Italy
2013 2019
166
attila666 @attila666
Guarda che il suggerimento di klingklang @klingklang è perfettamente corretto:
La soluzione è avere una tabella calendario separata
Mettendo in LEFT JOIN la tabella Calendario e tua_query.
Ipoteticamente: il Calendario potrebbe essere anche delle sole settimane (52 record) ed il JOIN si potrebbe fare tra il numero della settimana di entrambe le tabelle. Bisogna provare.
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.798
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
328
Infatti è così giulianovac @giulianovac , ma attila666 @attila666 vuole mettere anche dei filtri nella query, e siccome il WHERE agisce dopo il JOIN, praticamente va a vanificarne l'effetto, eliminando tutte le righe con i null (o valori diversi da quello selezionato col WHERE), quindi si torna alla casella 1 del gioco dell'oca... 🦆 Caffe_rido
 
  • Like
Reactions: attila666

attila666

Utente junior
6 Giugno 2017
54
6
roma
office 2010
2
un mio collega dove lavoro afferma (a voce) che bisognerebbe lavorare su Count([A-qry-PrimoReport].[Ordine]) e integrare qualcosa del genere (CASE WHEN IS NULL THEN 1 END) o usare gli IF (scusate ma vado a memoria di quello che ha detto) è una strada percorribile ?
 

denische

Nuovo utente
26 Settembre 2019
13
3
2007
1
Faccio una mia proposta..... che sicuramente non sarà giusta, ma al massimo cade nel vuoto.... e spero di non andare fuori da quel che è il tuo fine... e che magari avrai già valutato e non ti va bene
ma se lavorassi con una tabella a campi incrociati diversa con le settimane in riga ed lo stato di ordine in colonna...
del tipo con una SQL
Visual Basic:
TRANSFORM Count(Query1.[Stato Ordine]) AS [ConteggioDiStato Ordine]
SELECT Query1.Week, Query1.[Tipo Ordine]
FROM Query1
WHERE (((Query1.[Codice Tipo Impianto])="Y_PTM"))
GROUP BY Query1.[Codice Tipo Impianto], Query1.Week, Query1.[Tipo Ordine]
PIVOT Query1.[Stato Ordine];
potresti filtrare al massimo il codice tipo impianto e al massimo il tipo di ordine..... ovviamente anche in questo caso non puoi avere anche lo stato ordine solo a chiuso..... altrimenti come detto sopra a che servono le clausule WHERE!!!!
ma un conteggio di quanti ordini in quelle settimane sono chiusi, quanti rilasciati o presi in carico..
 
  • Like
Reactions: attila666

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!