计算字段的条件显示
问题描述:
我正在处理名为FCT_HISTO_PORTES的表,其中包含ID_MVT_EXPL和ID_PTE字段,它们是整数。在该表中,ID_MVT_EXPL与一个,两个或三个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。
我尝试过使用此SELECT,但结果不正确,因为所有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
那么在我的SELECT中需要改变什么?
答
我的建议有点不同。但是,如果我理解你是正确的。你可以这样做:
测试数据:
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
参考:
呀你的建议,这样的作品非常感谢你! :) – 2014-12-02 15:19:13
@ Jean-ChristopheCASTELLANA:没问题。乐意效劳 – Arion 2014-12-02 15:33:22