SQL请参考加入两个表,组和顺序

时间:2014-12-12 17:30:19

标签: sql sql-server

我有两个表需要咨询一个查询,我有Participante表来存储来自用户的一些数据和ParticipanteResultado来存储该用户的答案。< / p>

Participante

participanteID,
**other fields**

ParticipanteResultado

participanteResultadoID,
participanteID,
tipo,
quantidadeValidas

我的ParticipanteResultado表每个用户可以有大约10个结果,tipo上的结果可能不同(A,B,C,D ......)。

participanteResultadoID participanteID tipo quantidadeValidas
4                       88              S   5
5                       88              E   5
6                       88              A   2
7                       88              I   1
8                       94              S   2
9                       94              E   3
10                      94              A   2
11                      94              I   1
12                      98              S   0
13                      98              E   0
14                      98              A   0
15                      98              I   0

我需要的是显示用户数据和他的最佳结果。通过最佳结果,我的意思是quantidadeValidas字段上具有最高值的结果。

我的问题是,在我给出ParticipanteResultado数据的示例中,我让用户88有一个平局,我需要带上这两个值,它们可以在同一列中像( S,E)。

如果他没有任何有效答案quantidadeValidas = 0,我就不需要他tipo

UPDATE 在@lrb

的帮助下完成了一些工作
SELECT participanteID, nome, email, unidadeCE, telefone, 
tipo =
    SUBSTRING((
        SELECT  ', ' + CAST(tipo AS NVARCHAR(10))
        FROM 
        (
            SELECT DISTINCT pr.tipo, pr.participanteID
            FROM ParticipanteResultado pr
            WHERE pr.participanteID = p.participanteID AND quantidadeValidas > 0             
        )AS X2                      
        ORDER BY tipo FOR XML PATH( '' )
    ), 3, 1000 )
FROM Participante p;

输出:

participanteID  nome            email               unidadeCE   telefone         tipo
88              teste teste     teste@teste.com.br  41925       (11) 11111-1111  E, S
94              teste teste     teste@teste.com     36433       (11) 11111-1111  E, I, S

但是在participanteID 94的情况下,我应该只将E打印为tipo,因为它的值最高

2 个答案:

答案 0 :(得分:1)

而不是

SELECT DISTINCT pr.tipo, pr.participanteID
FROM ParticipanteResultado pr
WHERE pr.participanteID = p.participanteID AND quantidadeValidas > 0

作为最里面的SELECT,您可以使用:

SELECT TOP (1) WITH TIES pr.tipo
FROM ParticipanteResultado pr
WHERE pr.participanteID = p.participanteID AND quantidadeValidas > 0
ORDER BY quantidadeValidas DESC

Paul Williams * 的现在删除的答案中,首次建议使用此子查询(仅限AND quantidadeValidas > 0位)。


* 然而,保罗没有使用FOR XML中间层,如果没有它,他的解决方案就会打破带有关系的行(他最终可能已经意识到这一点,这可能就是他的原因)删除了他的答案)。

答案 1 :(得分:0)

Dense RankWindow function

一起使用
SELECT participanteID,
       nome,
       email,
       unidadeCE,
       telefone,
       tipo
FROM   (SELECT Dense_rank()OVER(partition BY a.participanteID ORDER BY quantidadeValidas) Rnk,
               *
        FROM   Participante a  join ParticipanteResultado b on a.participanteID = b.participanteID) P
WHERE  Rnk = 1