2012-08-31 3 views
3

Salut J'ai une table appelée tbdSalesComment obtenir des valeurs séparées par des virgules dans la requête?

Brand  Cust_ID Prd_ID 

Aftron 44301 T3485 
Aftron 44301 T0628 
Aftron 44301 T2952 
Aftron 44301 T1958 
Aftron 44302 T1940 
Aftron 44302 T1939 
Aftron 44303 T2419 
Aftron 44303 T2045 

Dans ce tableau, je veux que le Product_ID en séparées par des virgules avec le groupe par le Brand & Cust_ID

J'ai produit la requête comme suit:

SELECT DISTINCT 
     Brand 
    , Cust_ID 
    , (
     SELECT DISTINCT second_id + ', ' 
     FROM tbdSales t2 
     WHERE t2.Brand = t1.Brand AND t2.Cust_ID = t1.Cust_ID 
     FOR XML PATH('') 
    ) AS prd_ID into SalReport 
FROM tbdSales t1 
GROUP BY Brand,Cust_ID 

La requête ci-dessus donne des résultats. Mais, si les records sont plus nombreux (10 000), cela prend beaucoup de temps comme 5 minutes.

Veuillez me faire savoir tout autre moyen de réduire le temps d'achèvement des requêtes.

+0

Essayez l'aggrégateur 'CONCAT'. –

+3

Avez-vous un index sur les colonnes Brand et cust_id? – hgulyan

+0

Non je ne l'ai pas – user1632718

Répondre

1

Essayez ceci SQLFiddle example. Il utilise recursive query with CTE. Pour des résultats plus rapides que vous avez besoin d'index sur la marque, Cust_ID, prd_id:

with t2 as 
(select t0.*, 
    row_number() over (partition by Brand,Cust_id order by Prd_id asc) G_id 
    from 
(
    select distinct Brand,Cust_id,Prd_id from tbdSales 
) t0 

), 
    t1 as (
    select t.*, 
      cast(Prd_id as varchar(max)) as m2 
    from t2 t where g_id=1 

union all 
select b.*, 
     cast(c.m2+','+b.Prd_id as varchar(max)) as m2 
    from t2 b 
     inner join t1 c 
      on (c.g_id+1 = b.G_id) 
       and (b.Brand=c.Brand) 
       and (b.Cust_id=c.Cust_Id) 


) 
    select brand,cust_id,M2 as Prd_id from 
    (
    select t1.*, 
     row_number() over (partition by Brand,Cust_id order by g_id desc) rn 
      from t1 
) t3 where rn=1 
order by Brand,Cust_id 
+0

Salut Merci pour la relecture. En utilisant la question ci-dessus je reçois le résultat mais le moment est toujours le même problème – user1632718

+0

Vous devez créer des index pour obtenir des résultats plus rapidement. Par exemple: 'CREATE INDEX Idx_tbdSales_Brand ON tbdSales (Marque); CREATE INDEX Idx_tbdSales_Cust_ID ON tbdSales (Cust_ID); CREATE INDEX IDx_tbdSales_Prd_ID ON tbdSales (Prd_ID); ' – valex

0
SELECT distinct brand, Cust_ID, Replace(Replace(Replace(
          ( select t2.Prd_ID 
           from @Sales as t2 
           where t2.brand = t1.brand and t2.Cust_ID = t1.Cust_ID 
           For XML Raw) 
           , '"/><row Prd_ID="', ', ') 
           , '<row Prd_ID="', '') 
           , '"/>', '') FROM @Sales t1 

Salut, essayez ceci.

+0

Bonjour Merci pour la relecture. En utilisant la question ci-dessus je reçois le résultat, mais le moment est toujours le même problème – user1632718

Questions connexes