Nachdem ich ein wenig gesucht hatte, dachte ich, dass ich vielleicht eine Lösung gefunden hätte: sql join including null and non existing records. Überqueren Sie Joining meine Tabellen scheint wie ein guter Weg, um mein Problem zu lösen, aber jetzt habe ich einen Haken schlagen:SQL - Beitritt zu nicht existierenden Aufzeichnungen
Im Folgenden werden die Tabellen Ich verwende:
CREATE TABLE [dbo].[DCRSales](
[WorkingDate] [smalldatetime] NOT NULL,
[Store] [int] NOT NULL,
[Department] [int] NOT NULL,
[NetSales] [money] NOT NULL,
[DSID] [int] IDENTITY(1,1) NOT NULL)
CREATE TABLE [dbo].[Stores](
[Number] [int] NOT NULL,
[Has_Deli] [bit] NOT NULL,
[Alcohol_Register] [int] NULL,
[Is_Cost_Saver] [bit] NOT NULL,
[Store_Status] [nchar](10) NOT NULL,
[Supervisor_Number] [int] NOT NULL,
[Email_Address] [nchar](20) NOT NULL,
[Sales_Area] [int] NULL,
[PZ_Store_Number] [int] NULL,
[Has_SCO] [bit] NULL,
[SCO_Reg] [nchar](25) NULL,
[Has_Ace] [bit] NULL,
[Ace_Sq_Ft] [int] NULL,
[Open_Date] [datetime] NULL,
[Specialist] [nchar](2) NULL,
[StateID] [int] NOT NULL)
CREATE TABLE [dbo].[DepartmentMap](
[Department_Number] [int] NOT NULL,
[Description] [nvarchar](max) NOT NULL,
[Parent_Department] [int] NOT NULL)
CREATE TABLE [dbo].[ParentDepartments](
[Parent_Department] [int] NOT NULL,
[Description] [varchar](50) NULL
DCRSales ist eine Tabelle halten neue und archivierte Daten. Die archivierten Daten sind nicht perfekt, so dass es natürlich bestimmte fehlende Datenlücken gibt und einige Läden, in denen sie eine Abteilung haben, die sie nicht oder nicht mehr haben. Mein Ziel ist es, diese Tabelle mit unserer Abteilungsliste zu verknüpfen, die untergeordneten Abteilungen und übergeordneten Abteilungen aufzulisten und die net-sales für einen bestimmten Zeitraum SUM zu updaten. In Fällen, in denen ein Geschäft in diesem Zeitraum keine Abteilung hat, muss ich es trotzdem als 0,00 anzeigen.
Eine stabilere Lösung wäre wahrscheinlich, nur alle Abteilungen für jedes Geschäft zu speichern, unabhängig davon, ob sie diese Abteilung haben oder nicht (natürlich mit einem Umsatz von 0,00). Aber ich stelle mir vor, dies zu tun und/oder mein Problem hier zu lösen, würde sowieso sehr ähnliche Anfragen erfordern.
Die Abfrage ich versucht habe, ist wie folgt:
WITH CTE AS (
SELECT S.Number as Store, DepartmentMap.Department_Number as Department, ParentDepartments.Parent_Department as Parent, ParentDepartments.Description as ParentDescription, DepartmentMap.Description as ChildDescription
FROM Stores as S CROSS JOIN dbo.DepartmentMap INNER JOIN ParentDepartments ON DepartmentMap.Parent_Department = ParentDepartments.Parent_Department
WHERE S.Number IN(<STORES>) AND Department_Number IN(<DEPTS>)
)
SELECT CTE.Store, CTE.Department, SUM(ISNULL(DCRSales.NetSales, 0.00)) as Sales, CTE.Parent, CTE.ParentDescription, CTE.ChildDescription
FROM CTE LEFT JOIN DCRSales ON DCRSales.Department = CTE.Department AND DCRSales.Store = CTE.Store
WHERE DCRSales.WorkingDate BETWEEN '<FIRSTDAY>' AND '<LASTDAY>' OR DCRSales.WorkingDate IS NULL
GROUP BY CTE.Store, CTE.Department, CTE.Parent, CTE.ParentDescription, CTE.ChildDescription
ORDER BY CTE.Store ASC, CTE.Department ASC
In dieser Abfrage Ich versuche, aus der Shops Tabelle zu einem Geschäft JOIN jede Abteilung an den CROSS, so dass ich eine Kombination von jedem Geschäft zu erhalten und jeder Abteilung . Ich schließe auch die Elternabteilungen jeder Abteilung mit der Beschreibung der Kinderabteilung und der Beschreibung der Elternabteilung ein. Ich filter diesen ersten Teil basierend auf Filiale und Abteilung, aber dies ändert nicht das allgemeine Konzept.
Mit dieser Ergebnismenge versuche ich dann, diese Tabelle mit allen Verkäufen in DCRSales zu verbinden, die innerhalb eines bestimmten Datumsbereichs liegen. Ich füge auch das Datum hinzu, wenn es Null ist, weil die Ergebnisse, die einen NULL-Verkauf haben, auch ein NULL-WorkingDate haben.
Diese Abfrage schien zu funktionieren, bis ich bemerkte, dass nicht alle Abteilungen mit allen Geschäften verwendet werden. Insbesondere die Filialen, die nicht mit allen Abteilungen kombiniert werden, haben keine Daten für den angegebenen Zeitraum (dh sie sind geschlossen). Wenn für die Abteilung keine Daten vorhanden sind, sollten sie dennoch mit der Abteilungsnummer, der übergeordneten Nummer, der Abteilungsbeschreibung und der übergeordneten Beschreibung aufgeführt werden (mit Umsatz als 0,00). Jede Hilfe wird sehr geschätzt.
Ich sehe das Problem nicht, ist Ihre 'cte' nicht die umfassende Liste der Geschäfte/Abteilungen, die Sie suchen? Weil die Abfrage solide aussieht. –
Die Stores, die in der Stores-Tabelle enthalten sind, sind alle vorhanden und ziehen sie alle korrekt zurück. Stores, die keine Daten für den angegebenen Datumsbereich haben, haben jedoch eine zufällige Auswahl der Abteilungen mit $ 0,00. Ich dachte, die Abfrage war auch ziemlich solide, bis ich diese kleine Kuriosität bemerkte. – AlmondMan
Oh, deine 'WHERE'-Klausel filtert sie aus, verschiebe 'DCRSales.WorkingDate BETWEEN' 'UND' '' an deine Join-Kriterien und befreie 'WHERE' –