2016-07-23 8 views
0

私はこのようなテーブルをした、各ドット

------------------------ 
| product_id | price | 
------------------------ 
| 1   |   | 
| 1.2  |   | 
| 1.2.1  | 1  | 
| 1.2.2  | 2  | 
| 1.2.3  | 1  | 
| 1.3  |   | 
| 1.3.1  | 1  | 
| 1.3.2  | 1  | 

によって分離PRODUCT_ID私はPRODUCT_ID(PRODUCT_ID番号の小さい方)の各ヘッドを見ることができるように(合計)各PRODUCT_IDをカウントする必要がありますここに私が望む結果があります

------------------------ 
| product_id | price | 
------------------------ 
| 1   | 6  | 
| 1.2  | 4  | 
| 1.2.1  | 1  | 
| 1.2.2  | 2  | 
| 1.2.3  | 1  | 
| 1.3  | 2  | 
| 1.3.1  | 1  | 
| 1.3.2  | 1  | 

私はどのようなSQL文を使うべきですか?

+1

また、何を試しましたか?テーブルの列タイプは何ですか?あなたは価格フィールドに値を入力するあなたの "ルール"は何ですか?あなたは本当に*質問していません。 –

+1

@GordonLinoff:本当にそうですか?おそらくあなたは私の答えを以下で見直すべきであり、SQLの能力についてのあなたの広範な一般化にもっと慎重であるべきです。 –

答えて

2

このSQL:

SELECT parent.product_id, sum(child.price) as price 
FROM Table1 AS parent left join Table1 AS child 
    on child.product_id like parent.product_id & "*" 
group by parent.product_id 

union 

select product_id, price 
from table1 
where price is not null 

order by product_id 
; 

はあなたのサンプルデータのためのreqired出力を生成します。

注SQLクエリを構築するのに有用であるいくつかのこと:

  • 結果セットの二つの別々の部分を構成するためのUNIONを使用します。

  • 小計を生成するためのGROUP BYの使用。

  • JOIN句にLIKEを使用すると、大きなデータセットでパフォーマンスの問題が発生する可能性があります。これは、詳細なproduct_id値から小計階層への永久マッピングテーブルを作成することで軽減できます。本質的には、価格表から小計product_id行を削除します。