2012-03-24 17 views
2

私は3つのテーブルを持っている、私が必要なものIDでグループ、および別のテーブルからの和(3テーブル合計)

Name - columns 
Custpackingslipjour(table 1) - (deliverydate, dateclosed,, salesid) 
Inventrans (Table 2) - (itemid, datephysical, transrefid) 
Salesline (Table 3) - (lineamount, itemid, salesid 

すべての3つのテーブルを含む単一のテーブルであり、そのような複数の冗長情報がありません同じsalesids、そして合計金額(salesline.lineamount)と、どこに私がdeliverdateとclosed date、datephysicalに基づいて結果を排除することができるかは、もともと私はこれを持っていました。

SELECT  TOP (10) dbo.AX_CUSTPACKINGSLIPJOUR.DELIVERYDATE, 
dbo.AX_SALESLINE.LINEAMOUNT, dbo.AX_INVENTTRANS.DATEPHYSICAL, 
dbo.AX_INVENTTRANS.COSTAMOUNTPOSTED, dbo.AX_INVENTTRANS.ITEMID, 
dbo.AX_INVENTTRANS.TRANSREFID, dbo.AX_CUSTPACKINGSLIPJOUR.SALESID 
FROM   dbo.AX_CUSTPACKINGSLIPJOUR 
    INNER JOIN 
dbo.AX_SALESLINE ON dbo.AX_CUSTPACKINGSLIPJOUR.SALESID = dbo.AX_SALESLINE.SALESID 
    INNER JOIN 
    dbo.AX_INVENTTRANS ON dbo.AX_SALESLINE.ITEMID = dbo.AX_INVENTTRANS.ITEMID 

しかし、salesidとitemidの間に1対多の関係があるため、同じ行の多くを含む表が生成されます。

だから私は私が後にしているように各salesidに関連付けられたアイテムの価値の合計をグループ化すると考えました。

ここにいくつかの他の投稿に基づいて、私はsalesidのlineamountの合計をsalesidでグループ化してみましたが、5分間の実行後、それは良い解決策ではないようでした。私はそれを間違ってやっています。

select top 10 s.SALESID, 
    SUM(sp.LINEAMOUNT) as 'TotalLineamount' 
from AX_CUSTPACKINGSLIPJOUR as s 
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID 
where s.SALESID is not null 
group by s.SALESID,sp.LINEAMOUNT 

私がしようとしていることが不明な場合は、何か助けていただければ幸いです。

編集:@ coltechのアドバイスに従って、salesidで別名で試してみましたが、動作しませんでしたが、テストされました。私はトップ10

編集後の異なる(salesid)を挿入:Gavinsのアドバイスに続いて、私はまた、テーブルは、より良いテーブル名を一致させるための接頭辞を変更し

select top 10 cp.SALESID, 
SUM(sl.LINEAMOUNT) as 'TotalLineamount' 
from AX_CUSTPACKINGSLIPJOUR as cp 
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID 
where cp.SALESID is not null 
group by cp.SALESID 

に変更しました。しかし、これはうまくいきません。 sl.LINEAMOUNT、it.DATEPHYSICAL、it.COSTAMOUNTPOSTED、it.ITEMID、it.TRANSREFIDとcp.SALESID

その後、私のような、でグループにこれらを含める必要があります。

select top 10 cp.SALESID, 
SUM(sl.LINEAMOUNT) as 'TotalLineamount', 
cp.DELIVERYDATE, 
sl.LINEAMOUNT, it.DATEPHYSICAL, 
it.COSTAMOUNTPOSTED, it.ITEMID, 
it.TRANSREFID, cp.SALESID 
from AX_CUSTPACKINGSLIPJOUR as cp 
right outer join AX_SALESLINE as sl on cp.SALESID=sl.SALESID 
left outer join AX_INVENTTRANS as it on sl.ITEMID=it.ITEMID 
where cp.SALESID is not null 
group by cp.SALESID, cp.DELIVERYDATE,sl.LINEAMOUNT, it.DATEPHYSICAL, it.COSTAMOUNTPOSTED, it.ITEMID, it.transrefid 

ただし、このクエリは非常に長い時間実行され、25分近く実行されているように見えます。これをスピードアップする方法はありますか?それとも私はちょうどこれに間違って取り組んでいますか?

+0

私はあなたがSELECT DISTINCT TOP(10)を試してみましたと仮定します。.. ..? – Coltech

+0

@Coltechまあ、別の私の理解は、それが単一の列に基づいて単一のテーブル内のユニークなエントリを選択するために使用されるということです。私が達成しようとしているのは、3つのテーブルを組み合わせたsalesidのすべての異なるエントリを選択し、見つかった各salesidのライン数を合計することです。 – Tommy

答えて

2

は、私はとてもだけではなく、これを行う、あなたがして、グループにしたい列にまとめるべきではありません除いあなたは罰金だと思う:

select top 10 s.SALESID, 
    SUM(sp.LINEAMOUNT) as 'TotalLineamount' 
from AX_CUSTPACKINGSLIPJOUR as s 
right outer join AX_SALESLINE as sp on s.SALESID=sp.SALESID 
left outer join AX_INVENTTRANS as p on sp.ITEMID=p.ITEMID 
where s.SALESID is not null 
group by s.SALESID 
+0

これはうまくいきました。私の編集に反映された列をもっと導入するにはどうしたらいいですか? これまでの訂正とコメントをありがとう。 – Tommy

+0

グループに余分な列を追加するだけです。あなたがグループ化するとき、あなたはSUM、MIN、MAX、AVGなどをしているものでグループ化したくないのが普通です。 – GavinCattell

+0

http://weblogs.sqlteam.com/jeffs/archive/2005/12/14/8546に基づいています。aspx 集計関数の一部ではない列を選択して動作させるためにサブクエリを作成する必要があるように見えます。助けてくれてありがとう。 – Tommy

関連する問題