2017-05-25 4 views
-1

SQL Server 2012データベースでは、最後の学年の小学生に「缶詰」メッセージが使用された回数をカウントすることになっています現在の学年t-sql 2012は、期間または期間がないと考えるメッセージを解析します。

次は私が現在使用しているT-SQLである:

Declare @Delimiter char(2) = '. '; 

;WITH GetTheComments(Comments) AS 
(
    SELECT 
     GS.Comments 
    FROM 
     dbo.Enrol Enrol 
    JOIN 
     dbo.Student Student ON Student.StudentID = Enrol.StudentID 
    JOIN 
     dbo.GS GS ON GS.StudentID = Student.Studentid 
        AND (GS.Comments IS NOT NULL) 
        AND (GS.Comments <> '') 
    WHERE 
     Enrol.grade IN ('KG', '01', '02', '03', '04', '05', '06') 
     AND Enrol.endYear BETWEEN 2016 AND 2017 
), Pieces (Comments, start, stop) AS 
(
    SELECT 
     Comments, 
     CAST(1 AS BIGINT) AS start, 
     CAST(CHARINDEX(@Delimiter, Comments) AS BIGINT) AS stop 
    FROM 
     GetTheComments 

    UNION ALL 

    SELECT 
     Comments, 
     CAST(stop + Len(@Delimiter) AS BIGINT) AS start, 
     CAST(CHARINDEX(@Delimiter, Comments, stop + Len(@Delimiter)) AS BIGINT) AS stop 
    FROM 
     Pieces 
    WHERE 
     stop > 0 
), 
EachComment(Comments) AS 
(
    SELECT 
     LTrim(SUBSTRING(Comments, start, CASE WHEN stop > 0 THEN stop-start ELSE LEN(Comments) END)) AS Comments 
    FROM Pieces 
) 
SELECT 
    Comments, Count(*) AS Counts 
FROM 
    EachComment 
WHERE 
    Comments <> '' 
GROUP BY 
    Comments 
ORDER BY 
    Counts DESC, Comments ASC; 

を1つのGS.Commentsフィールドに複数のメッセージの例は次のようになります。

をこの学生は良いです数学でこの生徒は時間通りに割り当てを変えます。この生徒は学校を楽しんでいるようです。

1つのメッセージが1つのGS.Commentsフィールドにあるときの例では、次のようになります。

をこの学生は、問題がGS.Comments列がvarchar(1200)のように定義されている学校

を楽しんでいるようです。列には1つのメッセージがありますが、この列には多数のメッセージが存在する可能性があります。各メッセージはピリオドで終わり、varchar(1200)列にメッセージが1つ以上ある各メッセージの間にスペースがあります。

メッセージが1つだけの場合、メッセージの後にピリオドはありません。

問題は基本的に期間を持つメッセージのカウントがあると、同じメッセージのための期間がない場合のためにカウントされていない以下の

message          count 
----------------------------------------------------- 
This student seems to enjoy school.    150 
This student seems to enjoy school    25 

ように見える結果があることができています。

このように、上記のSQLで何ができるのかを私に見せてもらうことができるので、メッセージは同じものとして扱われます。基本的には、上記の1つのメッセージと1つのメッセージが必要です。

SELECT 
     case when Comments like '%.' then Comments else (Comments + '.') end as Comments 
    , COUNT(*) AS Counts 
FROM EachComment 
WHERE Comments <> '' 
GROUP BY 
     case when Comments like '%.' then Comments else (Comments + '.') end 
ORDER BY Counts DESC, Comments ASC; 
+0

をあなたが真剣にセットアップするためにあなたが言及すべてのテストケースをカバーするいくつかのサンプルデータが必要になります。 –

答えて

0

質問は、おそらく支援する次のようなケース式を使用して、唯一の末尾のピリオド程度であれば

(それが私たちの代わりにあなたから来た場合は最高です。