Aiuto con query di novizio

di il
14 risposte

Aiuto con query di novizio

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

  • Re: Aiuto con query di novizio

    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
  • Re: Aiuto con query di novizio

    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?
  • Re: Aiuto con query di novizio

    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....
  • Re: Aiuto con query di novizio

    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;
  • Re: Aiuto con query di novizio

    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...
  • Re: Aiuto con query di novizio

    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.....
  • Re: Aiuto con query di novizio

    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
  • Re: Aiuto con query di novizio

    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
  • Re: Aiuto con query di novizio

    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".
  • Re: Aiuto con query di novizio

    Si esatto è proprio così
  • Re: Aiuto con query di novizio

    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:
  • Re: Aiuto con query di novizio

    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....
  • Re: Aiuto con query di novizio

    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...
  • Re: Aiuto con query di novizio

    Ok ti ringrazio tanto per l'aiuto... sei stato davvero gentile!
Devi accedere o registrarti per scrivere nel forum
14 risposte