sql查询可能嵌套选择

时间:2012-04-26 07:59:02

标签: sql select nested

我的老板今天有一个愿景,就是彻底改变我几乎完整的程序的设计。 所以这里是我目前使用的查询显示产品组中的零件编号,其中有帕累托位置(帕累托是一个联盟,例如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的新表,它保留了帕累托历史:

字段是:Pg,Part,Pareto,PareoidID,date。

目前有20K部分具有唯一的ID为1到6,我需要获得该peroid的pareto和pg,就像我的代码已经做的那样(只是没有获得peroid)我需要为每个执行6次符号ID 1-6。 我认为它可能是多重选择语句或嵌套,但说实话,我无法解释查询将有多大以及需要多少。

这方面的帮助会很棒!

非常感谢!

澄清每个选择将从新表中获得帕累托。每个选择将获得pareto和alias作为pareto1,pareto2 .....等 因此查询需要选择并命名6次仍然使用我当前拥有的查询

1 个答案:

答案 0 :(得分:0)

好的解决方案是将表本身更改为单独的表。并通过观点加入他们。