2012-04-02 14 views
2

Ich habe versucht, herauszufinden, wie dies zu erreichen, aber ich denke, ich habe einfach nicht die Fähigkeiten zu wissen, was man in erster Linie suchen. Ich arbeite mit einem vorhandenen System und kann weder das Datenbankschema ändern noch diktieren, wie die Benutzer Daten eingeben. Ich muss mit dem arbeiten, was wir haben.split select Ergebnisse (eine Spalte) in mehrere Spalten

Derzeit legt unser Benutzer Statistikdaten in ein Textfeld in einer Tabelle. Sie verwenden ein Standardformat von einer Statistik pro Zeile mit Textqualifizierern, um die Details der Statistik zu begrenzen. dh

<Category> - D:<Description> Q:<Quanitity> V:<Value> 
<Category> - D:<Description> Q:<Quanitity> V:<Value> 

(es gibt keine <> Klammern in den tatsächlichen Daten ... Ich war mit ihnen nur um zu zeigen, wo Details gehen.)

Im obigen Beispiel werden die beiden Statistiken gehalten in einem Textfeld Datensatz ... und es gibt viele dieser Statistiken in der Tabelle.

Bearbeiten: Ich benutze MS SQL Server 2005 Ich muss einen Bericht für Summen von Quanitites/Werte pro Beschreibung erstellen.

Ich habe eine Split-Benutzerfunktion implementiert, die ich in einem Datensatz verwenden kann, um jede Zeile in einzelne Datensätze aufzuteilen ... aber das ist soweit ich es geschafft habe.

Ich muss 'StatsTable' auswählen, dann jeden Statistikdatensatz durchlaufen, in einzelne Zeilen aufteilen, dann die Kategorie, Beschreibung, Menge und Wert aus jeder Teilungslinie extrahieren und dann alle Ergebnisse zurückgeben ein Tisch.

+0

Sie sagen "Erstellen Sie einen Bericht für Summen von Quanitites/Werte pro Beschreibung." Kannst du das etwas besser beschreiben? Sie sollten wirklich vermeiden, in Begriffen wie "Schleife durch jeden Statistik-Datensatz" zu denken ... hoffentlich gibt es einen direkten Weg, um Ihre Ergebnisse ohne Schleifen zu erreichen. Aber Sie müssen einige Beispieldaten und gewünschte Ergebnisse zeigen. –

+0

Könnten Sie ein Beispiel für Ihre aktuellen Ergebnisse hinzufügen (nachdem Sie die Split-Funktion verwendet haben) und wie die Daten enden sollen? Darf man auch eine gespeicherte Prozedur verwenden? –

Antwort

0

Ich habe es geschafft, einen verschachtelten Cursor zusammenzufügen ... Es sieht so aus, als ob es funktioniert.

declare o CURSOR FAST_FORWARD FOR 
select comments from EVENT 

declare @comment nvarchar(max) 

OPEN o FETCH NEXT FROM o into @comment 

while @@FETCH_STATUS = 0 
BEGIN 
Declare @item nvarchar(750) 

declare @tbl Table(Category nvarchar(250), Description nvarchar(250), Quantity nvarchar(250), Value DECIMAL(10,2)) 

declare c CURSOR FAST_FORWARD FOR 
SELECT items FROM dbo.Split(@comment, Char(10)) 

OPEN c FETCH NEXT FROM c into @item 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @item = @item + ':' 
    insert into @tbl 
    Values (LTRIM(RTRIM(SUBSTRING(@item, 1, CHARINDEX(' - ', @item) - 1))), 
      CASE when @item like '%D:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('D:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('D:', @item)+2) - CHARINDEX('D:', @item) - 3))) else '' end, 
      CASE when @item like '%Q:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('Q:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('Q:', @item)+2) - CHARINDEX('Q:', @item) - 3))) else '1' end, 
      CASE when @item like '%V:%' Then CONVERT(DECIMAL(10,2),dbo.RemoveNonNumericCharacters(LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('V:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('V:', @item)+2) - CHARINDEX('V:', @item) - 3))))) else 0 end) 
    FETCH NEXT FROM c into @item 
END 
CLOSE c DEALLOCATE c 
END 
CLOSE o DEALLOCATE o 
SELECT * FROM @tbl 
Verwandte Themen