En SQL, comment puis-je split une valeur par le nombre de lignes dans lesquelles elle se trouve?

Je choisis deux tables, une table de produit et une table d'expédition, et construisons le tableau ci-dessous, mais je voudrais split le produit $ valeur par le nombre de rangées par ID de sorte que le produit $ soit divisé entre toutes les rangées il apparaît sur. Existe-t-il un moyen de le faire dans l'instruction select au fur et à mesure que je construis la table?

Ce que j'ai:

ID | Product $ | Shipping $ --------------------------------- 123456 | 200.00 | 5.00 123456 | 200.00 | 10.00 123567 | 186.00 | 7.99 

Ce que j'aimerais:

  ID | Product $ | Shipping $ --------------------------------- 123456 | 100.00 | 5.00 123456 | 100.00 | 10.00 123567 | 186.00 | 7.99 

Il est plus simple d'utiliser les fonctions de fenêtrage à la place des sous-requêtes:

 SELECT [ID] ,[Product $] / COUNT(*) OVER(PARTITION BY [ID]) ,[Shipping $] FROM MyTable 
 SELECT ID, ([Product $]/(SELECT COUNT(id) FROM t t1 WHERE t1.id=t.id)) [Product $] , [Shipping $] FROM t 

Avant de joindre la table de produits et d'expédition, vous pouvez calculer le prix du produit en fonction du nombre (comme dans la requête interne) et ensuite vous pouvez le joindre à la table d'expédition. À partir de la post-vue, vous pouvez utiliser la requête suivante comme reference:

 SELECT ps.id ,t1.new_c ,ps.shipping FROM product_shipping ps INNER JOIN ( SELECT id ,product / count(1) new_c FROM product_shipping GROUP BY id ,product ) t1 ON ps.id = t1.id; 

Depuis sqlfiddle est en panne, ici vous allez avec ideone

 SELECT ID, ([Product $] / (SELECT COUNT(ID) FROM TABLE t2 WHERE t2.ID = TABLE.ID)) as [Product $], [Shipping $] FROM TABLE 

Que dis-tu de ça

 SELECT p.ID, (p.[Product $] / c.CNT ) as [Result] ( SELECT ID,sum([Product $]) as [Product $] FROM [table] group by ID ) p inner join ( SELECT ID,count(1) as CNT FROM [table] group by ID ) c on (p.ID = c.ID)