SQL условный выбор для значения в той же группе таблиц - PullRequest
0 голосов
/ 30 марта 2012

У нас есть такая таблица:

id  mid mult    tr  result
----------------------------
1   1   1,35    0   1   
2   1   5,85    0   2   
3   1   4       1   X   
50  2   1,3     1   1   
51  2   7       0   2   
52  2   4       0   X   
99  3   2,45    0   1   
100 3   2,2     0   2   
101 3   3,3     1   X   
105 4   2,3     0   1   
106 4   2,4     0   2   
107 4   3,2     1   X   
111 5   3       1   1   
112 5   1,9     0   2   
113 5   3,25    0   X   

Нам нужен запрос, который принесет нам таблицу, которая будет подсчитывать, сколько раз до этого для определенного среднего (совпадения) были одинаковые значения mult (множители) для result = 1 и result = x, и группа их, чтобы мы могли их посчитать. Что-то вроде

select mult(where result = 1), mult(where result = x), count(1)

Результат будет таким

mult_1      mult_x      count
------------------------------
1,35        4           33
1,3         4           112

Выше указано, что мы видели 33 совпадения, где значение mult для результата = 1 равно 1,35, а значение mult для результата = x равно 4. Кроме того, мы нашли 112 совпадений, где значение multi для результата = 1 равно 1,3 result = x mult = 4 (результаты не зависят от первой таблицы).

Я сам нахожу это довольно сложным, но, надеюсь, я понял. Я использую SQL Server 2008, поэтому любой метод более чем приветствуется.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Вот мое (окончательное) решение в действии: http://www.sqlfiddle.com/#!3/3a516/7

Есть ряд предположений, которые я здесь делаю.

  • Я предполагаю, что каждое значение mid будет иметь самое большее 1 result значение '1' и 1 результат '2'.
  • Я предполагаю, что если вы хотите указать середину и выполнить запрос на этом.
    • Это предположение оказалось неверным.
  • Я предполагаю, что вы хотите включить данные для указанного вами mid.
    • Это предположение оказалось неверным, это был каждый матч.
  • Я предполагаю, что вы хотите включить каждый mid (или совпадение) перед указанным mid.
    • Это предположение оказалось неверным, это был каждый матч.
  • Я предполагаю, что для любой комбинации mult_1 и mult_x, которую вы найдете таким образом, вы хотите подсчитать, сколько раз эта комбинация встречается, даже если она происходит после указанного вами соответствия (mid).
    • Это предположение оказалось неверным, оно было только для каждого матча.

Если все эти предположения звучат правильно, то это может создать искомый результат:

DECLARE @Mid INT = 2

;WITH MatchResults AS
(
  SELECT
    Mid
    , [1] AS MultWithResult1
    , [X] AS MultWithResultX
  FROM
  (
    SELECT
      Mid
      , mult
      , result
    FROM Matches
    WHERE result IN ('1', 'X')
  ) Base
  PIVOT
  (
    MAX(mult)
    FOR result
    IN
    (
      [1]
      , [X]
    )
  ) Pivoted
)
SELECT
  mult.MultWithResult1 AS mult_1
  , mult.MultWithResultX AS mult_x
  , COUNT(*) AS [count]
FROM MatchResults mult
GROUP BY mult.MultWithResult1
  , mult.MultWithResultX

РЕДАКТИРОВАТЬ: Я отредактировал его на основе ответа на мой ответ на то, что я думаю, он имеет в виду.

1 голос
/ 30 марта 2012

Используйте этот запрос:

select mult_1, mult_x, count() as count
from Matches M
inner join (select distinct M1.mult as mult_1, MX.mult as mult_x from 
           matches as M1, matches as MX
           where M1.result=1 and MX.result=x) M1x
  on (M.mult=M1x.mult_1 and M.result=1) or (M.mult=M1x.mult_x and result=x)
group by mult_1, mult_x

РЕДАКТИРОВАТЬ: Я полагаю, вы хотите получить количество всех возможных комбинаций множителей совпадений с результатом = 1 и совпадений с результатом = x.

Если это так, M1x предоставляет все возможные комбинации.И вы присоединяетесь ко всем возможным матчам с любой из этих комбинаций и подсчитываете их, группируя по возможному набору комбинаций, определенных M1x.

...