0

请使用以下临时表和数据集作为参考。使用下面的数据集,我正在尝试创建一个新数据集。

DECLARE @Temp TABLE 
(
year_month int,
Vuid int,
Puid int,
ac_cd varchar(20),
sub_ac_cd varchar(20),
jdg_sts varchar(20),
voy_pl_usd int,
updt_stamp datetime
)
insert into @temp values(
202005,1,1,'M011','0','S',30,GETDATE()-2
)
insert into @temp values(
202006,1,1,'M011','0','P',20,GETDATE()-1
)
insert into @temp values(
202007,1,1,'M011','0','M',40,GETDATE()  
)
insert into @temp values(
202005,1,2,'M011','0','S',15,GETDATE()-2
)
insert into @temp values(
202006,1,2,'M011','0','P',10,GETDATE()-1
)
insert into @temp values(
202007,1,2,'M011','0','P',15,GETDATE()
)

输出数据集应如下所示:

在此处输入图像描述

我编写了以下查询,部分满足了我的要求:

(SELECT Vuid, Puid, ac_cd, sub_ac_cd, SUM (VOY_PL_USD) AS Cost
     FROM @Temp
     GROUP BY
            Vuid,
            Puid,
            ac_cd,
            sub_ac_cd
            )

但是成本还应该将最新的 jdg_sts 列值与 SUM 一起附加。我知道最新的记录是根据最新的 Year_month 选择的。

请注意:我的查询将放在视图中。请告诉我如何实现它..

数据集:

在此处输入图像描述

另一个版本的输出:

在此处输入图像描述

4

2 回答 2

1

尝试这个:

CREATE OR ALTER VIEW vw_view
AS
(
SELECT TOP (1) WITH TIES *
      ,SUM(VOY_PL_USD) OVER (PARTITION BY Vuid, Puid, ac_cd, sub_ac_cd) cost
FROM Temp
ORDER BY ROW_NUMBER() OVER (PARTITION BY Vuid, Puid, ac_cd, sub_ac_cd ORDER BY year_month DESC) 
)
GO

在此处输入图像描述

要将值放在一列中,只需使用字符串连接:

CREATE OR ALTER VIEW vw_view_1
AS
(
    SELECT TOP (1) WITH TIES year_month
                            ,Vuid
                            ,Puid
                            ,ac_cd
                            ,sub_ac_cd                          
                            ,voy_pl_usd
                            ,updt_stamp
                            ,CAST(SUM(VOY_PL_USD) OVER (PARTITION BY Vuid, Puid, ac_cd, sub_ac_cd) AS VARCHAR(12)) + jdg_sts AS [cost]
    FROM Temp
    ORDER BY ROW_NUMBER() OVER (PARTITION BY Vuid, Puid, ac_cd, sub_ac_cd ORDER BY year_month DESC) 
)
GO
于 2020-11-24T06:22:43.793 回答
0
 DECLARE @Temp TABLE (
    year_month INT
    ,Vuid INT
    ,Puid INT
    ,ac_cd VARCHAR(20)
    ,sub_ac_cd VARCHAR(20)
    ,jdg_sts VARCHAR(20)
    ,voy_pl_usd INT
    ,updt_stamp DATETIME
    )

INSERT INTO @temp
VALUES (
    202005
    ,1
    ,1
    ,'M011'
    ,'0'
    ,'S'
    ,30
    ,GETDATE() - 2
    )

INSERT INTO @temp
VALUES (
    202006
    ,1
    ,1
    ,'M011'
    ,'0'
    ,'P'
    ,20
    ,GETDATE() - 1
    )

INSERT INTO @temp
VALUES (
    202007
    ,1
    ,1
    ,'M011'
    ,'0'
    ,'M'
    ,40
    ,GETDATE()
    )

INSERT INTO @temp
VALUES (
    202005
    ,1
    ,2
    ,'M011'
    ,'0'
    ,'S'
    ,15
    ,GETDATE() - 2
    )

INSERT INTO @temp
VALUES (
    202006
    ,1
    ,2
    ,'M011'
    ,'0'
    ,'P'
    ,10
    ,GETDATE() - 1
    )

INSERT INTO @temp
VALUES (
    202007
    ,1
    ,2
    ,'M011'
    ,'0'
    ,'P'
    ,15
    ,GETDATE()
    )

SELECT *
FROM @Temp(SELECT Vuid, Puid, ac_cd, sub_ac_cd, SUM(VOY_PL_USD) AS Cost FROM @Temp GROUP BY Vuid, Puid, ac_cd, sub_ac_cd);

WITH cte
AS (
    SELECT Puid
        ,jdg_sts
        ,ROW_NUMBER() OVER (
            PARTITION BY puid ORDER BY updt_stamp DESC
            ) AS run
    FROM @Temp
    )
SELECT A.*
    ,cast(Cost AS VARCHAR) + jdg_sts
FROM (
    SELECT T1.Vuid
        ,T1.Puid
        ,T1.ac_cd
        ,T1.sub_ac_cd
        ,SUM(T1.VOY_PL_USD) AS Cost
    FROM @Temp T1
    GROUP BY T1.Vuid
        ,T1.Puid
        ,T1.ac_cd
        ,T1.sub_ac_cd
    ) A
LEFT JOIN cte cte ON cte.Puid = A.Puid
WHERE run = 1
于 2020-11-24T06:39:18.357 回答