0

私の上司は今日、私のほぼ完全なプログラムの設計を完全に変更するというビジョンを持っていました。それで、これが私が現在使用しているクエリで、パレートの位置がある製品グループの部品番号を表示しています(パレートはリーグで、たとえば1〜100、最も売れている部品です)。

上司が望んでいるのは、パレートの履歴に使用される追加の列です。

現在のコードは次のとおりです。

ALTER PROCEDURE [dbo].[MyParetoConfirmed]
@pgParam varchar(255)

AS
SELECT
   i.pg,
   dbo.OldParetoAnalysis.Pareto,
   i.keycode,
   i.sales6months,
   a.LostSales6Months,
   dbo.NewParetoAnalysis.Pareto

FROM
OPENQUERY(SACBAUTO, 'SELECT                      
                    dbo.product.Keycode,
                    dbo.iLines.Pg,
                    dbo.product.pg as ppg,
                    SUM(COALESCE(dbo.iLines.Qty, 0)) as sales6months,
                    dbo.iLines.Prefix 
                 FROM 
                    Autopart.dbo.product
                 LEFT OUTER JOIN
                    Autopart.dbo.ilines
                 ON
                    dbo.product.keycode = dbo.ilines.part
                    AND ([datetime] > dateadd(month, -6, getdate()) OR [datetime] is null )
                 WHERE
                    (dbo.iLines.Prefix = ''i'' OR dbo.iLines.Prefix is null)
                 group by 
                    dbo.ilines.pg,
                    dbo.product.keycode,
                    dbo.ilines.prefix,
                    dbo.product.pg
                 order by sales6months desc') i
RIGHT JOIN
dbo.OldParetoAnalysis
on
i.keycode collate SQL_Latin1_General_CP1_CI_AS = dbo.OldParetoAnalysis.Part
AND (i.pg = @pgParam or (i.pg is null AND i.ppg  = @pgParam))
INNER JOIN
dbo.NewParetoAnalysis
ON
dbo.OldParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS =   dbo.NewParetoAnalysis.Part

LEFT JOIN
OPENQUERY(SACBAUTO, 'SELECT                      
                    dbo.product.Keycode,
                    dbo.aLines.Pg,
                    SUM(COALESCE(dbo.aLines.Qty, 0)) as lostsales6months,
                    dbo.aLines.Prefix 
                 FROM 
                    Autopart.dbo.product
                 LEFT OUTER JOIN
                    Autopart.dbo.alines
                 ON
                    dbo.product.keycode = dbo.alines.part
                    AND ([datetime] > dateadd(month, -6, getdate()) OR [datetime] is null )
                 WHERE
                    (dbo.aLines.Prefix = ''d'' OR dbo.aLines.Prefix is null)
                 group by 
                    dbo.alines.pg,
                    dbo.product.keycode,
                    dbo.alines.prefix
                 order by lostsales6months desc') a
ON
dbo.NewParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS = a.keycode
WHERE(i.pg = @pgParam or (i.pg is null AND i.ppg  = @pgParam) AND dbo.NewParetoAnalysis.Pareto is not null)
GROUP BY
   i.pg,
   dbo.OldParetoAnalysis.Pareto,
   i.keycode,
   i.sales6months,
   a.LostSales6Months,
   dbo.NewParetoAnalysis.Pareto
ORDER BY
i.sales6months Desc

私が必要としているのは、paretoMainと呼ばれる結合された新しいテーブルです。これは、paretoperoidの履歴を保持します。

フィールドは、Pg、Part、Pareto、PareoidID、dateです。

現在、一意のペロイドID 1〜6の20Kパーツがあり、コードがすでに行っているように(ペロイドを取得しない)、そのペロイドとpgのパレートを取得する必要があり、各ペロイドID1に対してこれを6回実行する必要があります。 -6。複数のselectステートメントまたはネストである可能性があると思いますが、正直なところ、クエリのサイズと必要な量について頭を悩ませることはできません。

これに関するヘルプは素晴らしいでしょう!

どうもありがとう!

各選択を明確にするために、新しいテーブルからパレートを取得します。各選択は、paretoとエイリアスをpareto1、pareto2.....etcとして取得します。
したがって、クエリは6回選択して名前を付ける必要がありますが、現在のクエリを引き続き使用します

4

1 に答える 1

0

解決策は、テーブル自体を別のものに変更することでした。ビューを介してそれらを結合するだけです。

于 2012-04-27T11:01:36.223 に答える