2012-02-05 54 views
0

我正在調查數據,其中每個調查都有1或2行數據,每行都有一個分數,第1行有關鍵字。我需要彙總第1行包含特定關鍵字的所有調查分數。如何在一行中包含匹配關鍵字的所有相關行中使用SQL進行SUM

我試圖找到一個非Interative的方式總結爲多行分數爲包含特定關鍵字

SURVEYGUID ANSWER_NUMBER  SCORE KEYWORDS 
     FOO   1    3  MILK EGGS JUICE 
     FOO   2   10 
     WIZ   1    1  TOAST 
     WIZ   2    5 
     BAR   1    5  MILK TOAST 
     BAR   2    2 

僞代碼每個獨特的調查,很容易:

CALC_SCORE (txt) = 
    Find all SURVEYGUIDs where Keywords contains 'txt' 
    Then SUM all Scores for that list of SURVEYGUIDS 

CALC_SCORE(MILK)將找到的調查foo和bar,然後SUM(3 + 10)+(5 + 2)

CALC_SCORE(TOAST)將找到WIZ和BAR,然後SUM(1 + 5)+(5 +2)

是否有某種連接或數據透視允許我在單個或兩個SQL查詢中執行此操作?

(我的項目是軌道/ ActiveRecord的FWIW)

回答

3
SELECT SUM(Score) FROM MyTable WHERE SurveyGUID IN 
(SELECT DISTINCT SurveyGUID FROM MyTable WHERE Keywords LIKE '%MILK%') 

編輯:如果你擔心越來越誤報(由於像「奶昔」或「酪乳」字樣),你可以使用以下技術:

SELECT SUM(Score) FROM MyTable WHERE SurveyGUID IN 
(SELECT DISTINCT SurveyGUID FROM MyTable WHERE 
    Keywords = 'MILK' OR 
    Keywords LIKE 'MILK %' OR 
    Keywords LIKE '% MILK' OR 
    Keywords LIKE '% MILK %') 
+0

謝謝!我正試圖將其轉換爲activerecord來測試它! – jpwynn 2012-02-05 07:25:56

0
SELECT SUM(m.score) 
FROM MyTable m 
INNER JOIN 
    (SELECT DISTINCT surveyguid 
    FROM MyTable WHERE keywords LIKE '%MILK%') g ON g.surveyguid = m.surveyguid 

SELECT SUM(m.score) 
FROM MyTable m 
INNER JOIN 
    (SELECT DISTINCT surveyguid 
    FROM MyTable WHERE keywords LIKE '%TOAST%') g ON g.surveyguid = m.surveyguid 
0

只要僅第1行有這個應該工作的關鍵詞。否則,您將需要其中一個使用不同子查詢的其他答案。

SELECT SUM(t.SCORE) 
FROM myScoreTable AS t 
    INNER JOIN myScoreTable AS mt 
    ON t.SURVEYGUID = mt.SURVEYGUID 
WHERE mt.KEYWORDS LIKE '%MILK%' 
+0

謝謝你加入這個,會嘗試兩種方式。 – jpwynn 2012-02-05 07:29:45

0

正如其他人所建議的那樣,您可以使用子查詢或自動JOIN來做到這一點。

但是,這掩蓋了數據庫設計中的一個嚴重問題:通過在單個字段中存儲基本上是關鍵字數組的內容,違反了atomicity的原則,因此也是第一種標準形式。

你的做法也帶來了一些實際問題,例如:

  • LIKE '%MILK%'會發現「奶昔」還有,不只是「MILK」。
  • 索引更難 - 「正常」索引無助於後綴搜索,例如LIKE '%MILK%',並且全文索引可能在您的DBMS上不可用或不實用。

這是一個有趣的「第一行有關鍵字」的業務,其次是沒有他們?我認爲你正在設置自己的更大的問題,除非你正常化你的模型...

+0

我不同意,但它是我只需要使用的遺留數據... – jpwynn 2012-02-05 08:09:05

+0

爲了彌補假陽性問題(即獲得「奶昔」的命中),我編輯了我的回覆(接受的答案)。它使得查詢更加醜陋,可能會稍微慢一些,但它是可行的。理論上,我也同意數據模型非常糟糕 - 希望當他們做明年的調查時,他們會清理它! - 但是如果OP的工作是從他們已經收到的調查中提取數據,那麼這是水橋樑。不得不處理遺留代碼中不可改變的荒謬數據模型,我可以同情:) – StilesCrisis 2012-02-05 15:53:58

相關問題