Aiuto con query di novizio

di Anonimizzato11100 il
14 risposte
Ciao a tutti,
vi chiedo un aiuto per una query che non riesco ad impostare... vi spiego:

Ho creato questa query, che mi genera un risultato compost da due colonne (codice e utente)

Siccome per ogni codice ci possono essere diversi utenti, io vorrei raggruppare per utente il risultato. Come posso fare?

Secondariamente vorrei che il risultato raggruppato, generasse un file di testo che abbia il nume dell'utente e con dentro l'elenco dei codici tirati fuori dalla query... è possibile?

Grazie a tutti in anticipo....

14 Risposte

  • Ciao,
    facciamo che la tabelle contenga:
    
    CODICE    NOME
    a         nome_a1
    a         nome_a2
    a         nome_a3
    b         nome_b1
    b         nome_b2
    c         nome_c1
    per avere tutti i nomi (sono univoci vero?!?!) puoi raggruppare per NOME ed estrarre il max del CODICE(se NOME univoco, anche questo lo sarà!):
    select count(*)c, NOME,max(CODICE)CODICE
    from tab
    group by NOME
  • Si I nomi sono univoci...
    sto provando ma mi da un errore di oggetto "tab".

    Tu con tab intendevi la tabella? se si, devo salvare il risultato della prima query in un'altra tabella giusto?
  • Ciao,
    la sintassi SQL è uguale per tutti
    
    select [column1],[column2],..,[columnn]
    from [table]
    where [logical condition]
    
    cmq sì, tab stava per la tabella da cui estrai i dati.
    non sò da e come gli estrai, è un esempio...
    può essere una sub query, una vista, una tabella temporanea....
  • Ok grazie.
    si comunque estraggo da 2 tabelle differenti...
    Ti chiedo allora come faccio a mettere il risultato in una tabella temporanea...
    Ti copio qui sotto la query che magari ti può essere di aiuto per capire...

    select promocodes.CardCode, users.UserName from dbo.PromoCodes, dbo.Users where StartDate > '2017-01-01' and PromoCodeId in (select PromoCodeId from PromoCodeUsage where UserId = ANY (select userid from Users where UserId > 100)) ORDER BY Users.UserName ASC;
  • Select count(*)c, UserName ,max(CardCode)CardCode
    from 
    (
       select promocodes.CardCode, users.UserName from dbo.PromoCodes, dbo.Users where StartDate > '2017-01-01' and PromoCodeId in 
       (
             select PromoCodeId from PromoCodeUsage where UserId = ANY (select userid from Users where UserId > 100)
        ) 
    )t
    group by UserName 
    
    invece di usare tabelle temporanee usa una sub query...
    ti conviene riscreverla usando una join, studiati un po di sql, ti conviene...
  • Si sto studiando sql, ma da poco...

    comunque come l'hai scritta tu, mi da il risultato di un utente con il totale dei codici che ha a disposizione...
    io ho bisogno che raggruppi in questo modo:

    utente1 codice a
    codice b
    codice c


    utente2 codice a
    codice b
    codice c


    etc.....
  • Nn ho capito,
    quindi sono solo ordinati e non raggruppati?

    fai un esempio con questi valori:
    CODICE    NOME
    a         nome_a1
    a         nome_a2
    a         nome_a3
    b         nome_b1
    b         nome_b2
    c         nome_c1
  • Aspetta, non è proprio come hai scritto tu...

    Ogni utente ha 15 di questi codici, io vorrei raggruppare in modo che abbia:

    nome_a (codice a, codice b, codice c, ecc....)
    nome b (codice a, codice b, codice c, ecc...)

    e via discorrendo... ti copio qui il risultato della query cosi magari riesco a spiegarmi:
    CardCode UserName
    2017-25EUR-03 hlavelle
    2017-25EUR-04 hlavelle
    2017-25EUR-05 hlavelle
    2017-25EUR-06 hlavelle
    2017-25EUR-07 hlavelle
    2017-25EUR-08 hlavelle
    2017-25EUR-09 hlavelle
    2017-25EUR-10 hlavelle
    2017-25EUR-11 hlavelle
    2017-25EUR-12 hlavelle
    2017-25EUR-13 hlavelle
    2017-25EUR-14 hlavelle
    2017-25EUR-16 hlavelle
    CHRISTMAS7 hlavelle
    GREETING1 hlavelle
    GREETING2 hlavelle
    TEST-USAGE hlavelle
    2017-25EUR-01 hlenzen
    2017-25EUR-02 hlenzen
    2017-25EUR-03 hlenzen
    2017-25EUR-04 hlenzen
    2017-25EUR-05 hlenzen
    2017-25EUR-06 hlenzen
    2017-25EUR-07 hlenzen
    2017-25EUR-08 hlenzen
    2017-25EUR-09 hlenzen
    2017-25EUR-10 hlenzen
    2017-25EUR-11 hlenzen
    2017-25EUR-12 hlenzen
    2017-25EUR-13 hlenzen
  • Quindi una pivot?!
    UserName , CardCode1, CardCode2 , CardCode3 , CardCode4 , CardCode n+1 , ...
    hlavelle , 2017-25EUR-03 , 2017-25EUR-04, 2017-25EUR-05, ....
    hlenzen, 2017-25EUR-01, 2017-25EUR-02, 2017-25EUR-03, .....
    se così si può fare se i codici sono valori "statici", nel senso che sono 15 per tutti gli utenti, quindi x esempio progressivi da "2017-25EUR-01" a "2017-25EUR-15".
  • Si esatto è proprio così
  • Considera questo esempio:
    
    
    --qua creo una tabella come potrebbe essere la tua
    
    drop table #t
    select *
    into #t
    from (
    select'2017-25EUR-03'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-04'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-05'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-06'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-07'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-08'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-09'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-10'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-11'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-12'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-13'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-14'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-16'CardCode ,'hlavelle'UserName union all
    select'CHRISTMAS7'CardCode ,'hlavelle'UserName union all
    select'GREETING1'CardCode ,'hlavelle'UserName union all
    select'GREETING2'CardCode ,'hlavelle'UserName union all
    select'TEST-USAGE'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-01'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-02'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-03'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-04'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-05'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-06'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-07'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-08'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-09'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-10'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-11'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-12'CardCode ,'hlenzen'UserName union all
    select'2017-25EUR-13'CardCode ,'hlenzen'UserName)t
    
    SELECT *
    FROM
    (
    	--qua dovrai sostituire la tua tabella
    	--in aggiunta di un progressivo "row_number()over(partition by UserName order by (select 0))r" in cui, per ogni utente, genero un valore progressivo dato che presumo che il codice sia basato sulla data, x cui non statico.
    	select row_number()over(partition by UserName order by (select 0))r,*
    	from #t
    ) AS SourceTable
    PIVOT
    (
    max(cardcode)
    --qua definisco la profondità dei valori che posso estrarre, questo è statico!
    FOR r IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19])
    ) AS PivotTable;

    questo il riferimento:
  • Grazie mille per la risposta...penso di aver capito bene, ma il problema è che fare una select iniziale come hai scritto tu, è infattibile...sono 740 user con 19 codici l'uno...mi ammazzo...

    select *
    into #t
    from (
    select'2017-25EUR-03'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-04'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-05'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-06'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-07'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-08'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-09'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-10'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-11'CardCode ,'hlavelle'UserName union all
    select'2017-25EUR-12'CardCode ,'hlavelle'UserName union all....
  • No, non hai capito, come da commento l insert iniziale mi serviva solo per avere un esempio...
    a te interessa solo:
    SELECT *
    FROM
    (
       --qua dovrai sostituire la tua tabella
       --in aggiunta di un progressivo "row_number()over(partition by UserName order by (select 0))r" in cui, per ogni utente, genero un valore progressivo dato che presumo che il codice sia basato sulla data, x cui non statico.
       select row_number()over(partition by UserName order by (select 0))r,*
       from #t
    ) AS SourceTable
    PIVOT
    (
    max(cardcode)
    --qua definisco la profondità dei valori che posso estrarre, questo è statico!
    FOR r IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19])
    ) AS PivotTable;
    e sostituisci #t con la tua tabella...ora devi metterci un po testa tu e pedalare...
  • Ok ti ringrazio tanto per l'aiuto... sei stato davvero gentile!
Devi accedere o registrarti per scrivere nel forum
14 risposte