我有两个表需要咨询一个查询,我有Participante
表来存储来自用户的一些数据和ParticipanteResultado
来存储该用户的答案。< / p>
表Participante
participanteID,
tipo,
**other fields**
EF使用来自tipo
的{{1}}字段,因此我可以从查询中接收数据
表Participante
ParticipanteResultado
我的participanteResultadoID,
participanteID,
tipo,
quantidadeValidas
表每个用户可以有大约10个结果,ParticipanteResultado
上的结果可能不同(A,B,C,D ......)。
tipo
我需要的是显示用户数据和他的最佳结果。通过最好的结果,我的意思是在participanteResultadoID participanteID tipo quantidadeValidas
4 88 S 5
5 88 E 5
字段上具有最高值的结果。我已经设法用以下查询来做到这一点:
quantidadeValidas
我的问题是,在我给出SELECT participanteID, nome, email, unidadeCE, telefone,
(SELECT TOP(1) tipo FROM ParticipanteResultado pr
WHERE p.participanteID = pr.participanteID
ORDER BY quantidadeValidas DESC) AS tipo FROM Participante p
数据的示例中,我让用户ParticipanteResultado
有一个平局,我需要带上这两个值,它们可以在同一列中像( S,E)。
更新
这是我的查询结果:
88
P.S。我在c#Entity Framework上使用此查询与我的数据库上下文
答案 0 :(得分:1)
根据集合来考虑数据。
您需要一组包含所有参与者及其所有分数的数据 和一组参与者的最大量化值Validas
首先获取每个参与者的最大quantdadeValidas列表
SELECT MAX(PR.quantidadeValidas), PR.participanteID
FROM ParticipanteResultado PR
GROUP BY participanteID
现在获得参与者和分数。
SELECT participanteID, nome, email, unidadeCE, telefone,
FROM Participante p
INNER JOIN ParticipanteResultado PR
on p.participanteID = pr.participanteID
现在我们有两组数据需要将所有分数限制为仅最大值,因此将两个组合并在一起。对每个上述查询使用公用表表达式,然后连接应该为您提供保持关系的所需结果。
with maxScores as (
SELECT MAX(PR.quantidadeValidas) maxScore, PR.participanteID
FROM ParticipanteResultado PR
GROUP BY participanteID
),
CompleteSet as (
SELECT participanteID, nome, email, unidadeCE, telefone, PR.tipo PR.quantidadeValidas
FROM Participante p
INNER JOIN ParticipanteResultado PR
on p.participanteID = pr.participanteID)
SELECT CS.participanteID, nome, email, unidadeCE, telefone, tipo
FROM maxScores MS
INNER JOIN CompleteSet CS
on MS.MaxScore = CS.QuantidadeValidas
and CS.ParticipanteID = MS.ParticipanteID
或者没有CTE(通用表格表达式)......(但在我看来更难阅读)
SELECT CS.participanteID, nome, email, unidadeCE, telefone, tipo
FROM (
SELECT MAX(PR.quantidadeValidas) maxScore, PR.participanteID
FROM ParticipanteResultado PR
GROUP BY participanteID) MS
INNER JOIN (
SELECT participanteID, nome, email, unidadeCE, telefone, PR.tipo PR.quantidadeValidas
FROM Participante p
INNER JOIN ParticipanteResultado PR
on p.participanteID = pr.participanteID) CS
on MS.MaxScore = CS.QuantidadeValidas
and CS.ParticipanteID = MS.ParticipanteID
现在如果你只想在一个平局时只需要一行,你就必须使用Stuff,或者使用forXMLpath将多行合并为一个......但是因为你预期的结果并没有。为了展示你如何设想工作关系,我选择了多排概念。而不是将值组合到Tipo列。
答案 1 :(得分:1)
由于您只需要每个参与者的最高结果,我会使用排名功能:
WITH cte
AS ( SELECT participanteID ,
nome ,
email ,
unidadeCE ,
telefone ,
tipo ,
RANK() OVER ( PARTITION BY participanteID ORDER BY tipo DESC ) AS rnk
FROM ParticipanteResultado
)
SELECT DISTINCT
participanteID ,
nome ,
email ,
unidadeCE ,
telefone ,
SUBSTRING(( SELECT ',' + t1.tipo AS [text()]
FROM cte t1
WHERE t1.participanteID = t2.participanteID
AND t1.rnk = 1
ORDER BY t1.participanteID
FOR
XML PATH('')
), 2, 1000) [tipos]
FROM ParticipanteResultado t2
WHERE t2.rnk = 1
答案 2 :(得分:0)
查看CTE或xml路径。这些值需要合并到一个字段中,但需要另外一个子查询来执行此操作。
SELECT participanteID, nome, email, unidadeCE, telefone,
tipos=
SUBSTRING((
SELECT ', ' + CAST(tipo AS NVARCHAR(10))
FROM
(
SELECT DISTINCT tipo FROM ParticipanteResultado WHERE participanteID=X2.UserID
)AS X2
ORDER BY tipo FOR XML PATH( '' )
), 3, 1000 )
FROM Participante p