2012-04-03 5 views
1

Mit Microsoft SQL Server 2008 habe ich eine Abfrage, die etwas Aufmerksamkeit benötigt. Ich bin verwirrt über die Joins benötigt, um meine Abfrage korrekt durchzuführen.SQL verbindet Problem

USE [ShaftData] 
GO 
/****** Object: StoredProcedure [dbo].[MyPareto] Script Date: 04/03/2012 19:32:31 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[MyPareto] 
as 

SELECT i.pg, 
    dbo.OldParetoAnalysis.Pareto, 
    i.part, 
    i.sumofqty, 
    a.sumofqty, 
    dbo.NewParetoAnalysis.Pareto 

FROM 
    OPENQUERY(SACBAUTO, 'SELECT dbo.iLines.Part, 
          dbo.iLines.Pg, 
          SUM(dbo.iLines.Qty) as sumofqty, 
          dbo.iLines.Prefix 
        FROM Autopart.dbo.iLines 
        where prefix = ''i'' 
        and [datetime] > dateadd(month, -6, getdate()) 
        group by 
        dbo.ilines.pg, 
        dbo.ilines.part, 
        dbo.ilines.prefix 
        order by sumofqty desc') i 
RIGHT JOIN 
dbo.OldParetoAnalysis 
on 
i.part collate SQL_Latin1_General_CP1_CI_AS = dbo.OldParetoAnalysis.Part 

LEFT JOIN 
    OPENQUERY(SACBAUTO, 'SELECT dbo.aLines.Part, 
          dbo.aLines.Pg, 
          SUM(dbo.aLines.Qty) as sumofqty, 
          dbo.aLines.Prefix 
        FROM Autopart.dbo.aLines 
        where prefix = ''d'' 
        and [datetime] > dateadd(month, -6, getdate()) 
        group by 
        dbo.alines.pg, 
        dbo.alines.part, 
        dbo.alines.prefix 
        order by sumofqty desc') a 
ON 
dbo.OldParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS = a.part 
FULL JOIN 
dbo.NewParetoAnalysis 
ON 
a.part collate SQL_Latin1_General_CP1_CI_AS = dbo.NewParetoAnalysis.Part 
WHERE 
i.pg = '31' 
GROUP BY 
    i.pg, 
    dbo.OldParetoAnalysis.Pareto, 
    i.part, 
    i.sumofqty, 
    a.sumofqty, 
    dbo.NewParetoAnalysis.Pareto 
ORDER BY 
dbo.OldParetoAnalysis.Pareto desc 

Ok die Erklärung, ich muss diese Felder zeigen. Momentan brauche ich alle Zeilen von alten Pareto zu zeigen. new pareto ist ein Klon des alten, der für die Aktualisierung verwendet wird (das ist der nächste Teil, der geplant ist).

Das Problem ist, dass derzeit meine Pareto korrekt 1-5780 zeigt. aber die neue Pareto-Spalte, die Zeile für Zeile übereinstimmen sollte, zeigt Leerzeichen, dies deutet darauf hin, dass nicht alle Zeilen angezeigt werden (möglicherweise etwas mit NULL-Werten zu tun haben).

Ich hoffe, es ist etwas mit meinen Joins zu tun, wie Sie es wahrscheinlich eine komplizierte Abfrage sehen, aber es funktioniert für das, was ich brauche, Problem ist die Zeit, es ist schnell, weil ich 24 Stunden haben, um diese Abfrage mit Nein abzuschließen vorherige Planung (ja, ich habe mich auch geärgert).

Oh und Pareto ist nur eine Nummer zu den meistverkauften Teile, wie eine Liga zugeordnet.

Wenn Sie weitere Informationen benötigen, einfach fragen und schlecht bearbeiten.

Vielen Dank

EDIT: Ok das Problem gelöst, wird die Antwort aktualisiert.

Ich bin sehr verwirrt, kann mir jemand zeigen, wie ich jetzt meine alten und neuen Pareto-Tabellen aktualisieren würde? da Theres eine Tonne

+1

Huch ... vielleicht in Betracht ziehen, diese 'OPENQUERY' in eine Ansicht zu ändern, die auf Ihren Verbindungsserver verweist? Das würde wahrscheinlich einen langen Weg in Richtung Vereinfachung Ihrer Abfrage führen, so dass es einfacher ist, den Kopf herumzukriegen. –

+0

Yup, nachdem ich für einen Rauch ging, habe ich endlich diesen Sauger geknackt. erfordern, dass ich das Layout der Abfrage und Joins ändere. Ill poste die bearbeitete Version, wenn jemand interessiert ist – lemunk

+2

Wenn Sie noch Fragen haben, würde ich Ihre Frage aktualisieren. Wenn Ihre aktualisierte Abfrage Ihre Probleme löste, poste ich sie als Antwort auf Ihre eigene Frage und markiere sie als akzeptierte Antwort. –

Antwort

1

heren den Kodex verbindet:

USE [ShaftData] 
GO 
/****** Object: StoredProcedure [dbo].[MyPareto] Script Date: 04/04/2012 08:50:40 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[MyPareto] 
@pgParam varchar(255) 
AS 
SELECT i.pg, 
    dbo.OldParetoAnalysis.Pareto, 
    i.part, 
    i.sales6months, 
    a.LostSales6Months, 
    dbo.NewParetoAnalysis.Pareto 

FROM 
OPENQUERY(SACBAUTO, 'SELECT dbo.iLines.Part, 
          dbo.iLines.Pg, 
          SUM(dbo.iLines.Qty) as sales6months, 
          dbo.iLines.Prefix 
        FROM Autopart.dbo.iLines 
        where prefix = ''i'' 
        and [datetime] > dateadd(month, -6, getdate()) 
        group by 
        dbo.ilines.pg, 
        dbo.ilines.part, 
        dbo.ilines.prefix 
        order by sales6months desc') i 
RIGHT JOIN 
dbo.OldParetoAnalysis 
on 
i.part collate SQL_Latin1_General_CP1_CI_AS = dbo.OldParetoAnalysis.Part 
INNER JOIN 
dbo.NewParetoAnalysis 
ON 
dbo.OldParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS = dbo.NewParetoAnalysis.Part 

LEFT JOIN 
OPENQUERY(SACBAUTO, 'SELECT dbo.aLines.Part, 
          dbo.aLines.Pg, 
          SUM(dbo.aLines.Qty) as LostSales6Months, 
          dbo.aLines.Prefix 
        FROM Autopart.dbo.aLines 
        where prefix = ''d'' 
        and [datetime] > dateadd(month, -6, getdate()) 
        group by 
        dbo.alines.pg, 
        dbo.alines.part, 
        dbo.alines.prefix 
        order by LostSales6Months desc') a 
ON 
dbo.NewParetoAnalysis.Part collate SQL_Latin1_General_CP1_CI_AS = a.part 
/*FULL OUTER JOIN 
dbo.NewParetoAnalysis 
ON 
a.part collate SQL_Latin1_General_CP1_CI_AS = dbo.NewParetoAnalysis.Part*/ 
WHERE 
i.pg = @pgParam 
GROUP BY 
    i.pg, 
    dbo.OldParetoAnalysis.Pareto, 
    i.part, 
    i.sales6months, 
    a.LostSales6Months, 
    dbo.NewParetoAnalysis.Pareto 
ORDER BY 
dbo.OldParetoAnalysis.Pareto asc 

Jetzt habe ich eine neue Frage. Mit cis, wie würde ich die alten und neuen Pareto-Tabellen aktualisieren?