You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server动态透视查询PHP数组冗余及自定义尺寸排序问题

解决SQL Server动态透视+PHP展示的两个问题

咱们一个问题一个问题来解决:

问题1:PHP返回的数组存在冗余数据

你看到的重复数据是因为PDO默认的fetchAll()模式是PDO::FETCH_BOTH——它会同时返回**关联键(比如Location Code、L)和数字索引(0、1、2...)**的结果,导致每个值都重复出现。

解决方法很简单,只需要在调用fetchAll()时指定只返回关联数组模式:

修改PHP代码中的这一行:

$result = $sth->fetchAll();

改为:

$result = $sth->fetchAll(PDO::FETCH_ASSOC);

这样返回的数组就只会保留字段名作为键,冗余的数字索引项就消失了。

问题2:自定义尺寸排序规则(S-M-L-XL)

默认的字母排序会把L放在M前面,S排在最后,不符合从小到大的逻辑。我们可以给每个尺寸定义一个排序权重,在生成动态透视列的时候按这个权重排序,就能得到想要的列顺序。

修改SQL中的列名生成逻辑

你需要修改两个地方的列名查询(生成@ColumnName和@SelectColumnNames的部分),添加排序权重并按权重排序:

修改@ColumnName的生成:

SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME([size])
FROM (
    SELECT DISTINCT [size],
        -- 给每个尺寸分配排序优先级
        CASE [size]
            WHEN 'S' THEN 1
            WHEN 'M' THEN 2
            WHEN 'L' THEN 3
            WHEN 'XL' THEN 4
            -- 处理数字尺寸,直接转成数值排序
            ELSE TRY_CAST([size] AS INT)
        END AS sort_order
    FROM [db].[dbo].[table]
    WHERE [Item No_] = @item AND [Open] = @open
) AS data
ORDER BY sort_order ASC

修改@SelectColumnNames的生成:

SELECT @SelectColumnNames = ISNULL(@SelectColumnNames + ',','') + 'ISNULL(' + QUOTENAME([size]) + ', 0) AS ' + QUOTENAME([size])
FROM (
    SELECT DISTINCT [size],
        CASE [size]
            WHEN 'S' THEN 1
            WHEN 'M' THEN 2
            WHEN 'L' THEN 3
            WHEN 'XL' THEN 4
            ELSE TRY_CAST([size] AS INT)
        END AS sort_order
    FROM [db].[dbo].[table]
    WHERE [Item No_] = @item AND [Open] = @open
) AS data
ORDER BY sort_order ASC

这样生成的动态透视列就会严格按照S→M→L→XL,再加上数字尺寸从小到大的顺序排列。如果以后新增尺寸(比如XXL),只需要在CASE语句里添加对应的排序值即可。


内容的提问来源于stack exchange,提问作者Bldjef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:33:07