2016-08-25 12 views
0

テーブルAは、注文ごとに1行の注文テーブルです。表Bは項目ごとに1行のItemsテーブルです。それらは注文番号によってリンクされています。オーダーに1つ以上のアイテムがあった場合、私はこのO/Nに参加すると、複数のオーダーのラインを取得します。私は別のテーブルのフィールドでグループ化しているので、そのメソッドを使用することはできません。MYSQL "レコード"ごとに異なる行の金額で関連テーブルを結合

正しい順序で結合する方法1注文行と3アイテム行が3注文と3アイテムに変わらない?

基本的な質問に対する謝罪、私の脳は今日のメルトダウンにあります。

私は以下で尋ねていることを簡略化しました。

CREATE TABLE Orders 
    (`ORDURN` varchar(8), `ORDSOU` varchar(10), `ORDVAL` decimal(9,2)) 
; 

INSERT INTO Orders 
    (`ORDURN`, `ORDSOU`, `ORDVAL`) 
VALUES 
    ('12345112', 'WEB', '28.41'), 
    ('22544548', 'ADVERT', '11.58'), 
    ('44848643', 'TELEPHONE', '41.18') 
; 


CREATE TABLE Items 
    (`ITMSTK` varchar(10), `ITMQTY` varchar (3), `ITMCOG` int(9), `ITMURN` varchar(8), `ITMSOU` varchar(10)) 
; 

INSERT INTO Items 
    (`ITMSTK`, `ITMQTY`, `ITMCOG`, `ITMURN`, `ITMSOU`) 
VALUES 
    ('WN778', '1', '2.00', '12345112', 'WEB'), 
    ('WN776', '1', '1.45', '12345112', 'WEB'), 
    ('WN771', '1', '1.86', '12345112', 'WEB'), 
    ('WN845', '1', '1.45', '22544548', 'ADVERT'), 
    ('WN846', '1', '1.38', '22544548', 'ADVERT'), 
    ('WN845', '1', '20.16', '44848643', 'TELEPHONE') 
; 
CREATE TABLE Sources 
    (`SOUCOD` varchar(10), `SOUDESC` varchar(45)) 
; 
INSERT INTO Sources 
    (`SOUCOD`, `SOUDESC`) 
VALUES 
    ('WEB', 'Web Orders 2016'), 
    ('ADVERT', 'Advert Junes 2016'), 
    ('TELEPHONE', 'Telephone Orders 2016') 
; 

そして、私はその後、

select 
S.soucod as Sources, 
s.soudesc as Description, 
sum(i.itmcog) as COG, 
count(DISTINCT o.ordurn) as Orders, 
sum(o.ordval) as OrderValue 
from sources s 
join orders o on o.ordsou = s.soucod 
join items i on i.itmsou = s.soucod 
group by s.soucod 

以下このクエリを実行していることは私を与えるために

Sources  Description   COG Orders OrderValue 
ADVERT  Advert Junes 2016  2  1  23.16 
TELEPHONE Telephone Orders 2016 20  1  41.18 
WEB   Web Orders 2016   5  1  85.23 
明らか

それは複数行

を数えているように順序値が加入によって歪められています

これは望ましい結果です(商品の原価は間違っていますが、私はそれがなぜ私のクリエイティブなのかを知っていますデータをated、このコラムは)アイテムテーブルに持参する必要性を示すこと以外の目的のために、ここではありません。

Sources  Description   COG Orders OrderValue 
ADVERT  Advert Junes 2016  2  1  11.58 
TELEPHONE Telephone Orders 2016 20  1  41.18 
WEB   Web Orders 2016   5  1  28.41 

私は、これはそれを説明したいと考えています。

答えて

1

中間結果を計算して順次結合が必要です。結合の外部レベルでは、サブクエリの結果に関数max()が使用されます。

select Sources, Description, 
     sum(i.itmcog) as COG, 
     max(Orders) as Orders, max(OrderValue) as OrderValue 
    from (
     select s.soucod as Sources, s.soudesc as Description, 
       count(o.ordurn) as Orders, 
       sum(o.ordval) as OrderValue 
      from sources s 
      join orders o on o.ordsou = s.soucod 
     group by s.soucod 
     ) A 
    join items i on i.itmsou = A.Sources 
    group by A.Sources 

依存テーブルから1つだけ選択した結果は、あなたが選択リスト内のサブクエリを使用することができた場合:

select s.SOUCOD as Sources, s.soudesc as Description, 
     (select sum(i.itmcog) 
      from items i 
     where i.itmsou=s.soucod 
     ) as COG, 
     count(o.ordurn) as Orders, 
     sum(o.ordval) as OrderValue 
    from sources s 
    join orders o on o.ordsou = s.soucod 
group by s.soucod 
0
SELECT s.soucod sources 
    , s.soudesc description 
    , SUM(i.itmcog) COG 
    , COUNT(DISTINCT o.ordurn) orders 
    , o.ordval ordervalue 
    FROM sources s 
    JOIN orders o 
    ON o.ordsou = s.soucod 
    JOIN items i 
    ON i.itmsou = s.soucod 
GROUP 
    BY sources 
    , description 
    , ordervalue; 
関連する問題