Sql server 计算字段的条件显示

Sql server 计算字段的条件显示,sql-server,sql-server-2008,conditional,Sql Server,Sql Server 2008,Conditional,我正在处理一个名为FCT_HISTO_PORTES的表,该表包含ID_MVT_EXPL和ID_PTE字段,它们是整数。在该表中,ID_MVT_EXP与一个、两个或三个ID_PTE相关联 下面是一个例子: select top 1000 ID_MVT_EXPL, ID_PTE from FCT_HISTO_PORTES ID_MVT_EXPL ID_PTE 3945546 6 3945547 25 3945548 56 3945548 57 3945549

我正在处理一个名为FCT_HISTO_PORTES的表,该表包含ID_MVT_EXPL和ID_PTE字段,它们是整数。在该表中,ID_MVT_EXP与一个、两个或三个ID_PTE相关联

下面是一个例子:

select top 1000
ID_MVT_EXPL,
ID_PTE
from FCT_HISTO_PORTES

ID_MVT_EXPL ID_PTE
3945546     6
3945547     25
3945548     56
3945548     57
3945549     25
3945550     52
3945551     57
3945551     58
3945553     56
3945557     51
3945558     57
3945558     58
您可以看到3945546有一个ID_PTE,3945548有两个不同的ID_PTE

游戏的目的是,我可以为每个ID_MVT_EXPL显示一行,其中包含命名字段ID_PTE_1、ID_PTE_2、ID_PTE_3

我尝试使用此选择,但结果不正确,因为所有ID_PTE都适合ID_PTE_1,而将其他两个保留为NULL

select top 1000
ID_MVT_EXPL,
MIN(id_pte) as ID_PTE_1,
case 
    when COUNT(id_pte) = 2
    then MAX(id_pte) 
    when COUNT(id_pte) = 3
    then SUM(id_pte)-(MIN(ID_PTE)+MAX(ID_PTE))
end as ID_PTE_2,
case 
    when COUNT(id_pte) = 3
    then MAX(id_pte)
end as ID_PTE_3
from FCT_HISTO_PORTES
group by ID_MVT_EXPL, ID_PTE

ID_MVT_EXPL ID_PTE_1 ID_PTE_2 ID_PTE_3
3945546     6        NULL     NULL
3945547     25       NULL     NULL
3945548     56       NULL     NULL
3945548     57       NULL     NULL
3945549     25       NULL     NULL
3945550     52       NULL     NULL
3945551     57       NULL     NULL
3945551     58       NULL     NULL
3945553     56       NULL     NULL
3945557     51       NULL     NULL
3945558     57       NULL     NULL
3945558     58       NULL     NULL

那么,我的选择需要改变什么呢?

我的建议有点不同。但如果我理解你的话,你是对的。您可以这样做:

测试数据:

查询:

输出:

参考:


是的,你的建议很有效,非常感谢@让·克里斯托弗·卡斯特拉纳:没问题。很乐意帮忙
DECLARE @tbl TABLE(ID_MVT_EXPL INT, ID_PTE INT)
INSERT INTO @tbl
VALUES
(3945546,6),(3945547,25),(3945548,56),(3945548,57),
(3945549,25),(3945550,52),(3945551,57),(3945551,58),
(3945553,56),(3945557,51),(3945558,57),(3945558,58)
SELECT
    pvt.ID_MVT_EXPL,
    pvt.[1] AS ID_PTE_1,
    pvt.[2] AS ID_PTE_2,
    pvt.[3] AS ID_PTE_3
FROM
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY tbl.ID_MVT_EXPL ORDER BY ID_PTE) AS RowNbr,
        tbl.ID_MVT_EXPL,
        tbl.ID_PTE
    FROM
        @tbl AS tbl
) AS SourceTable
PIVOT
(
    MAX(ID_PTE)
    FOR RowNbr IN([1],[2],[3])
) AS pvt
3945546 6   NULL    NULL
3945547 25  NULL    NULL
3945548 56  57      NULL
3945549 25  NULL    NULL
3945550 52  NULL    NULL
3945551 57  58      NULL
3945553 56  NULL    NULL
3945557 51  NULL    NULL
3945558 57  58      NULL