2016-05-19 6 views
0

Ich brauche eine Tabelle zu erstellen, die das folgende LayoutDer Aufbau einer Tabelle mit Gruppen und gruppiert Elemente (nicht aggregierten)

benötigt [Kopfzeile - enthält verschiedene Datenspalten]

[Items - bezogen Enthält Daten durch eine ID, nicht in irgendeiner Weise auf die Kopf Spalten im Zusammenhang]

[Blank Row]

[Die nächste Gruppe Artikel]

Können sagen, wir haben 3 tabl es ... [tblPurchases], [tblLocations], [tblItems] Ich brauche einen neuen Header für jedes Element in [tblPurchases] und dann müssen alle Elemente von [tblItems] verknüpft mit [PurchasePKID] unter jedem Header-Element aufgelistet werden.

jetzt muss ich auch das tun folgende ..... [tblPurchases] kann oder auch nicht ein [LocationPKID] Wenn FALSCH dann die Kopfzeilen Daten sammeln müssen von [tblPurchases] Wenn TRUE dann der Header Zeilen sammeln Daten von [tblPurchases] und [tblLocations].

Es gibt keine Aggregatfunktionen, es werden lediglich Daten aus der Tabelle abgerufen.

Dies ist die Grundfunktionalität im gehen zu testen und ich bin daran interessiert, wie jemand anderes nähert sich dies, die eigentliche Abfrage, die ich jetzt habe, ist ein wenig komplexer als dieses Beispiel, es muss auch andere Tabellen abhängig von den Elementen zu überprüfen Daten und Ausgabe noch eine andere Ebene von Elementen für jeden Artikel, aber dieses Beispiel wird mir eine gute Idee, wie das mit anderen Methoden (hoffentlich) zu tun.

Meine aktuelle Methode verwendet verschachtelte Cursor, um die Kopfzeilen, Elemente und Unterelemente zu durchlaufen, und erstellt die Ausgabetabelle jeweils 1 Stück. seine mehr als 350 Zeilen lang, die wirklich zu groß ist, so dass ich hoffe, euch mir hier :)

Dank

+0

Fügen Sie Beispieltabellendaten hinzu, das erwartete Ergebnis. Zeigen Sie uns auch Ihren aktuellen Abfrageversuch und beschreiben Sie, was damit nicht stimmt. – jarlh

+0

[tblPurchases] (ID, Standort-ID, Daten), [tblLocations] (ID, Daten), [tblItems] (ID, Kauf-ID, Daten). Dies ist nur ein Test, um eine andere Methode zu finden, dies zu tun. Ich bin nicht so gut im sql, also versuche ich ein paar Ideen zu bekommen. Meine aktuelle Query funktioniert gut, nur ein bisschen langsam, also suche ich nach einer anderen Methode. –

+0

Die Ausgabe sollte für jedes Element in Käufe eine Kopfzeile hinzufügen dann überprüfen Sie die Tabelle Elemente für die zugehörige Kauf-ID und die Elemente auflisten, so sollte es so etwas wie [HeaderRow1] dann [Items List1] dann [HeaderRow2] etc usw. sein Spalten sind nicht das gleiche in dieser Ausgabetabelle, die Header und Elemente Zeilen haben keine übereinstimmenden Spaltennamen, es muss manuell erstellt werden (es sei denn es gibt eine Möglichkeit, es zu tun, weiß ich nicht) –

Antwort

0
use [AdventureWorks2012] 
go 

declare @worktable table 
(rectype int, salesorderid int,detail varchar(132)) 


insert into @worktable 
Select 1, 
     [SalesOrderID], 
     concat([OrderDate],' ', p.[PersonType],' ',p.[Title] , ' ', p.[FirstName], ' ', p.[LastName]) 
from [Sales].[SalesOrderHeader] sh 
join [Sales].[Customer] sc on sc.customerid = sh.CustomerID 
join [Person].[Person] p on p.[BusinessEntityID] = sc.PersonID 
where SalesOrderID in (43659,43660,43661,43662,43663,43664) 

insert into @worktable 
Select 3, 
     [SalesOrderID], 
     '' 
from [Sales].[SalesOrderHeader] sh 
join [Sales].[Customer] sc on sc.customerid = sh.CustomerID 
join [Person].[Person] p on p.[BusinessEntityID] = sc.PersonID 
where SalesOrderID in (43659,43660,43661,43662,43663,43664) 

insert into @worktable 
select 2, 
     sd.[SalesOrderDetailID], 
     concat(sd.[ProductID], ' ',p.[Name],' ',sd.[LineTotal]) 
from [Sales].[SalesOrderDetail] sd 
join [Production].[Product] p on p.ProductID = sd.[ProductID] 
where sd.[SalesOrderDetailID] in (43659,43660,43661,43662,43663,43664) 

select case 
     when rectype = 1 then 'Header' 
     when rectype = 2 then 'Detail' 
     else 'Blank' 
     end type, 
     salesorderid, detail 
from @worktable 
order by salesorderid,rectype 
+0

Hallo Paul S. Seit ich diesen Hasen laufen lasse, dachte ich, ich würde mein Denken mit Adventure-Arbeiten illustrieren . Im Grunde erstelle ich eine Arbeitstabelle mit einigen Schlüsselfeldern und einen Detailblock mit einem Datensatztyp, um die Ausgabe zu sequenzieren. –

+0

Das sieht vielversprechend aus, also wird dies zunächst eine einzige Tabelle mit allen nicht organisierten Headern und Elementen erstellen und dann mit einer gemeinsamen ID und RecType organisieren, ich denke, das ist es wert, getestet zu werden. krank post zurück, nachdem ich es versucht habe. –

+0

Kann ich mit dieser Methode leicht eine leere Zeile zwischen den Kopfzeilen und den letzten Elementen hinzufügen? Oder wäre es einfacher, das aus dem Anwendungscode zu tun, auf dem diese Tabelle verwendet wird? –

0

Wenn ich Sie richtig verstehen helfen können, müssen Sie nicht das Ergebnis TABLE erhalten möchten. Sie möchten REPORT mit einigen Tabellen erhalten, die verschiedene Spalten enthalten (HEAVER, ITEMS ...).

Das ist Ihre Lösung mit Cursors ist keine schlechte Idee.

+0

Ja, ich kann keine Basisabfrage verwenden, um das Ergebnis auszugeben, da ich keine einzelne Spaltenstruktur benötige. Im Moment benutze ich Cursor, um bestimmte Tabellen zu loopen und dann die Ausgabetabelle Zeile für Zeile zu erstellen dies zu tun .... klingt wie es vielleicht nicht durch Ihre Antwort :) –

+0

gibt es eine Lösung, wenn die Ausgabe als Text mit Unterabfrage und Gruppierung zum Beispiel, aber es kann monströs sein. deklarieren t1 tabelle (c varchar (10), c2 varchar (10)) in t1-werte ('a', 'a') einfügen in t1-werte ('a', 'b') in t1 einfügen Werte ('a', 'c') \t \t Fall \t \t \t wählen, wenn sc dann 'header' \t \t \t wenn s.c2 ist null null ist dann 'subheader oder etwas anderes' \t \t \t sonst sc + '|' + S.c2 \t \t Ende \t von \t \t (tc wählen, t.c2 \t \t \t von t1 t \t \t \t Gruppe durch Aufsummierung (tc, t.c2) \t \t) s \t Reihenfolge von sc, s.c2 – xdd

+0

Ich denke, das ist ähnlich dem Code von P.Salmon gegeben ..... ich werde dies versuchen, folgen Sie den Fortschritt auf P. Salmon's Antwort, wenn Sie noch ein paar Ideen haben, Danke. Übrigens ist mein aktueller SP monströs (350 Zeilen), also ist es in Ordnung, wenn es groß sein muss, genauso lang wie es schnell ist :) –

Verwandte Themen