2016-03-23 7 views
3

私は、PHPで次のことを行う非常にシンプルなSQLだと思ったことを試しましたが、正しく表示されず、ソリューションを "google"する良い方法を見つけることができません。私はこのテーブルの複数の列を持つ200,000以上のレコードを保持するvaloreguide2テーブルを持っていますが、いくつかのカラムでは異なる値を持ち、他のカラムでは同じ値を持つ重複ローです。私はすべての値を取って新しいテーブルに入れたいが、これを行うには、isbnというラベルの列に同じ値を持つ行を結合し、新しい行の1行にすべての値を保持したい表。値の重複があるテーブルのデータを1つの行に結合するにはどうすればよいですか?

の例では、画像を参照してください傾けるならば、それは自動インクリメントフィールドを含む20個の列を持つテーブルがある picture of table

です。私はこのテーブルからすべての情報を取り出し、それを異なるカラムタイトルの別のテーブルに挿入したいが、isbnに基づいてそれらを結合したい。

`$results = $conn->query("select * from valoreguide2 group by isbn"); 
while ($row12 = $results->fetch_assoc()) { 
$isbn = $row12['isbn']; 
$APrice =$row12['Acomm']; 
$AQty=$row12['Aqty']; 
$IPrice =$row12['Icomm']; 
$IQty=$row12['Iqty']; 
$SPrice =$row12['Scomm']; 
$SQty=$row12['Sqty']; 
$TPrice =$row12['Tcomm']; 
$TQty=$row12['Tqty']; 
$NPrice =$row12['Ncomm']; 
$NQty=$row12['Nqty']; 
$BBPrice =$row12['BBcomm']; 
$BBQty=$row12['BBqty']; 



$guide_prices = array('amtext'=>(float)($APrice), 'ingram'=>(float)($IPrice), 'sterling'=>(float)($SPrice), 'tichenor'=>(float)($TPrice), 'nebraska'=>(float)($NPrice), 'BB'=>(float)($BBPrice),); 

$bestGuidePrice = max($guide_prices); 
$bestGuidePrice = number_format($bestGuidePrice,2,'.',''); 

foreach ($guide_prices as $key => $val) { 
if ($val == max($guide_prices)) 
{ 
    $bestGuide = $key; 
} 

    } 

$valoreprice=(($bestGuidePrice/1.15)-5); 

$conn->query("insert into valorebest2 (isbn, aprice, iprice, sprice, tprice, nprice, bookbyte, bestprice, valore, bestguide) values ('$isbn','$APrice','$IPrice','$SPrice','$TPrice','$NPrice','$BBPrice','$bestGuidePrice','$valoreprice','$bestGuide') "); 
}` 

が、私は十分に私に知らせてください提供していない場合は結果が..私は上の入力したくなかった...それは1つだけ選んでいる行を結合されていません。私が書いたコードは、以下です誰かがあなたにコンマを忘れてしまったと言っているときに。

編集:MySQLの

編集を使用して

:これは私が enter image description here

答えて

1

を探しています出力されますが、データベースについて特異的であることができる、あなたが使用します。Oracle、MS SQL、MySQLを。 ?

これはansi SQLに基づく回答です。希望します。

テストデータ。
CREATE TABLE tbs_test (ID, ISBN, A, B, C, D) AS SELECT 1,'0001','A','B','C',10 FROM DUAL UNION ALL SELECT 2,'0002','A',null,null,null FROM DUAL UNION ALL SELECT 3,'0002',null,'B',null,null FROM DUAL UNION ALL SELECT 4,'0002',null,null,'C',null FROM DUAL UNION ALL SELECT 5,'0003','A',null,'C',10 FROM DUAL UNION ALL SELECT 6,'0003',null,null,null,10 FROM DUAL UNION ALL SELECT 7,'0004',null,null,'C',10 FROM DUAL;

これは、isbnでグループを選択し、各列の最小値をとり、同じisbnを持つ行に存在します。 ISBNによって
select isbn, min(A), min(B), min(C), min(D) from tbs_test group by isbn order by isbn;

この選択グループは、A、B、Cとの合計D
select isbn, min(A), min(B), min(C), sum(D) from tbs_test group by isbn order by isbn;

希望の最小値をとり、それはあなたが選択してみましょう文句を言わない場合、これは、:-)

+0

私はそれが私の提案は、挿入部を処理しません:-) ANSIのSQLである一方、MySQLは、私の提案を受け入れると思うのMySQL –

+0

を使用しています。挿入物を選択から入力させる方法がわからない場合は教えてください –

+0

INSERT INTO valorebest2(isbd、A、B、C、D)SELECT isbn、min(A)、...... '等 –

0

を支援しますどのように地球上でどのような価値を得ることができますか? :-)

これはデータにアクセスするのに成功します(注意:fake_time列は、入力テーブルで2つの異なる状況をエミュレートする単なる方法です。あなたがコードで生きて行くつもりならば/更新):

CREATE TABLE tbs_test_input (ID, ISBN, A, B, C, D, Fake_time) AS 
SELECT 1,'0001','A','B','C',10,1 FROM DUAL UNION ALL 
SELECT 2,'0002','A',null,null,null,1 FROM DUAL UNION ALL 
SELECT 3,'0002',null,'B',null,null,1 FROM DUAL UNION ALL 
SELECT 4,'0002',null,null,'C',null,1 FROM DUAL UNION ALL 
SELECT 5,'0003','A',null,'C',10,1 FROM DUAL UNION ALL 
SELECT 6,'0003',null,null,null,10,1 FROM DUAL UNION ALL 
SELECT 7,'0004',null,null,'C',10,1 FROM DUAL UNION ALL 
SELECT 8,'0003',null,'B',null,null,2 FROM DUAL UNION ALL 
SELECT 9,'0003',null,'B',null,20,2 FROM DUAL UNION ALL 
SELECT 10,'0004','A',null,null,null,2 FROM DUAL 
; 

create table tbs_test_output as select ISBN, A, B, C, D 

1 = 2 tbs_test_inputから。

insert into tbs_test_output 
select isbn, min(A), min(B), min(C), min(D) 
    from tbs_test_input 
where isbn not in (select isbn from tbs_test_output) 
    and fake_time = 1 
group by isbn 
order by isbn; 

select * from tbs_test_output; 

update tbs_test_output o 
set (A,B,C,D) = (
select min(i.A), min(i.B), min(i.C), min(i.D) 
    from tbs_test_input i 
    where i.fake_time = 2 
group by i.isbn 
having i.isbn = o.isbn 
) 
WHERE EXISTS (
    SELECT 1 
     FROM tbs_test_input i 
    WHERE i.isbn = o.isbn 
     and i.fake_time = 2) 
; 

select * from tbs_test_output; 

結果:挿入

4行。

ISBN A B C D \---- - - - ---------- 0001 A B C 10 0002 A B C 0003 A C 10 0004 C 10

2行を更新しました。

ISBN A B C D \---- - - - ---------- 0001 A B C 10 0002 A B C 0003 B 20 0004 A

関連する問題