SQL条件选择同一个表组中的值

时间:2012-03-29 22:12:40

标签: sql sql-server select conditional multiple-columns

我们有一个这样的表:

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   

我们需要的是一个查询,它将为我们提供一个表,该表将计算特定中间(匹配)之前多少次具有相同的结果(乘数),结果= 1且结果= 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次匹配,其中结果= 1的多数为1,35,而结果= x的多数为4.此外,我们发现112匹配,其中结果= 1的多数为1,3 AND result = x mult为4(结果不依赖于第一个表)。

我发现自己相当复杂,但希望我有道理。我使用SQL Server 2008,所以任何方法都非常受欢迎。

2 个答案:

答案 0 :(得分:2)

以下是我的(最终)解决方案:http://www.sqlfiddle.com/#!3/3a516/7

我在这里做了很多假设。

  • 我假设每个mid值的result值最多为'1''2'的结果为1 mid
  • 我假设你想要指定一个mid并让查询运行掉。
    • 这个假设被证明是错误的。
  • 我假设您要包含您指定的mid的数据。
    • 这个假设被证明是错误的,这是每场比赛。
  • 我假设您希望在指定的mid之前包含每个mid(或匹配)。
    • 这个假设被证明是错误的,这是每场比赛。
  • 我假设对于您以这种方式找到的任何mult_1和mult_x组合,您希望计算该组合发生的次数,即使它发生在您指定的匹配(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}}
编辑:我根据对我认为他的意思的答案的回答编辑了它。

答案 1 :(得分:1)

使用此查询:

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会提供所有这些可能的组合。并且你加入所有可能的matchea并且有任何这些组合,并计算它们,按照M1x定义的可能的组合分组。