Frage

Ich habe eine Tabelle, die eine freet Texteingabe aus einer Umfrage listet wo enterents durften ihre Antworten eingeben (in Bezug auf Farben, die sie möchten in ihrer Hochzeit haben)

Ich möchte eine SQL-Funktion schreiben, die von dieser Spalte alle Daten sammelt und Aufträge zählt die Frequenz jedes Wortes, von dieser Zählung die Ergebnismenge der Bestellung.

Response
--------
Red and White
green
White and blue
Blue
Dark blue

Ich möchte die obige Tabelle bestellt werden wie folgt

Response  Frequency
--------  ---------
Blue      3
White     2
And       2
Red       1
Green     1

kann ich alle Müll Wörter wie „und“ Streifen, nachdem die Funktion ausgeführt wurde. Kennt jemand eine gute Funktionen, die dieses Verhalten erzeugen?

War es hilfreich?

Lösung

Okay, funktioniert dies ein Genuss. Zunächst wird eine Funktion, um die Werte zu trennen ...

Alter Function dbo.SeparateValues    

(    
 @data VARCHAR(MAX),    
 @delimiter VARCHAR(10)     
)     
RETURNS     
@tbldata TABLE(col VARCHAR(MAX))    
As    
--Declare @data VARCHAR(MAX) ,@delimiter VARCHAR(10)     
--Declare @tbldata TABLE(col VARCHAR(10))    
--Set @data = 'hello,how,are,you?,234234'    
--Set @delimiter = ','    
--DECLARE @tbl TABLE(col VARCHAR(10))    
Begin    
DECLARE @pos INT    
DECLARE @prevpos INT    
SET @pos = 1     
SET @prevpos = 0    

WHILE @pos > 0     
BEGIN    
SET @pos = CHARINDEX(@delimiter, @data, @prevpos+1)    
if @pos > 0     
INSERT INTO @tbldata(col) VALUES(LTRIM(RTRIM(SUBSTRING(@data, @prevpos+1, @pos-@prevpos-1))))    
else    
INSERT INTO @tbldata(col) VALUES(LTRIM(RTRIM(SUBSTRING(@data, @prevpos+1, len(@data)-@prevpos))))    
SET @prevpos = @pos     
End    

RETURN       
END    

dann nur wende ich es an meinen Tisch ...

Select Count(*), sep.Col FROM (
        Select * FROM (
            Select value = Upper(RTrim(LTrim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(response, ',', ' '), '.', ' '), '!', ' '), '+', ' '), ':', ' '), '-', ' '), ';', ' '), '(', ' '), ')', ' '), '/', ' '), '&', ''), '?', ' '), '  ', ' '), '  ', ' ')))) FROM Responses
        ) easyValues
        Where value <> '' 
    ) actualValues 
    Cross Apply dbo.SeparateValues(value, ' ') sep
    Group By sep.Col
    Order By Count(*) Desc

Okay, also ging ich OTT mit meiner verschachtelten Tabellen, aber ich habe alle Mist Zeichen gezupft, trennte die Werte und hielt eine laufende Summe der am häufigsten verwendeten Wörter.

Andere Tipps

Sie sind Hauptproblem ist, dass Sie eine Split-Funktion in SQL Server sind vermisst.

Theres eine Probe eine hier, die ziemlich gut aussieht ..

http://www.sqlteam.com/forums/topic.asp ? topic_id = 50648

Mit, dass Sie schreiben eine gespeicherte Prozedur entlang der Linien von ...

CREATE TABLE #Temp (Response nvarchar(50), Frequency int) 

DECLARE @response nvarchar(100)
DECLARE db_cursor CURSOR FOR 
SELECT response FROM YourTable

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @response 

WHILE @@FETCH_STATUS = 0  
BEGIN  
       /* Pseudo Code */ 
       --Split @Response 
       --Iterate through each word in returned list
       --IF(EXISTS in #TEMP)
       --    UPDATE THAT ROW & INCREMENT THE FREQUENCY
       --ELSE
       --    NEW WORD, INSERT TO #Temp WITH A FREQUENCY OF 1

       FETCH NEXT FROM db_cursor INTO @response 
END   

SELECT * FROM #Temp

Theres wahrscheinlich einen weniger fugly Weg, dies ohne Cursor zu tun, aber wenn es nur etwas, das Sie muß einmal laufen, und du bist Tisch oder Antworten nicht phänomenal groß ist, dann sollte diese Arbeit

DECLARE @phrases TABLE (id int, phrase varchar(max))
INSERT @phrases values
(1,'Red and White'  ),
(2,'green'          ),
(3,'White and blue' ),
(4,'Blue'           ),
(5,'Dark blue'      );

SELECT word, COUNT(*) c
FROM @phrases
CROSS APPLY (SELECT CAST('<a>'+REPLACE(phrase,' ','</a><a>')+'</a>' AS xml) xml1 ) t1
CROSS APPLY (SELECT n.value('.','varchar(max)') AS word FROM xml1.nodes('a') x(n) ) t2
GROUP BY word
word         freq
----------- -----------
and         2
blue        3
Dark        1
green       1
Red         1
White       2
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top