如图 用sql行转列 图一原表,图二希望转换后

img

如图 用sql行转列 图一原表,图二希望转换后,用sql server 进行语句转换。感谢
(不能用 case when 因为日期可能是一个大的范围,图中只是示例)


--建表
CREATE TABLE #tmp
(
    a INT ,
    b VARCHAR(100),
    c INT,
    d DATETIME,
    e NUMERIC(18,2),
    f MONEY,
    g MONEY
)
--插入测试数据
INSERT INTO #tmp values(1,'小小',111,'2020-01-01',10.2,99,88)
INSERT INTO #tmp values(2,'大大',222,'2021-02-10',20.3,66,77)
INSERT INTO #tmp values(3,'中中',333,'2022-03-02',30.5,55,76)
INSERT INTO #tmp values(4,'齐齐',444,'2023-04-20',40.5,85,82)
INSERT INTO #tmp values(5,'琪琪',555,'2024-05-03',50.9,23,10)
INSERT INTO #tmp values(6,'七七',666,'2025-06-04',60.0,11,10)

--动态拼接SQL,先列转行,再行转列
DECLARE @sql VARCHAR(max)=''
DECLARE @where VARCHAR(max)=''

SET @where=(
    SELECT ','+QUOTENAME( ROW_NUMBER() OVER(ORDER BY GETDATE()))  FROM #tmp 
    FOR XML PATH('')
)

SET @sql='SELECT *  FROM 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER  BY  y) AS z,id,x,y  FROM 
    (
        SELECT 
        ROW_NUMBER() OVER(ORDER  BY GETDATE()) AS id,
        CONVERT(VARCHAR(4000),a) AS a,
        CONVERT(VARCHAR(4000),b) AS b,
        CONVERT(VARCHAR(4000),c) AS c,
        CONVERT(VARCHAR(4000),CONVERT(VARCHAR(10),d,121)) AS d,
        CONVERT(VARCHAR(4000),e) AS e,
        CONVERT(VARCHAR(4000),f) AS f,
        CONVERT(VARCHAR(4000),g) AS g
        FROM #tmp 
    ) a UNPIVOT 
    (
        x FOR y IN (a,b,c,d,e,f,g)
    ) b
) c
PIVOT
(
    MAX(x)
    FOR id IN ('+STUFF(@where,1,1,'')+')
) d'

EXEC (@sql)


DROP  TABLE #tmp
 

img

这种最好在代码中实现,不要在SQL中进行实现!

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632