php - SQL Pivot Query 中的 PHP 数组显示不同的数据
问题描述
我有一个 SQL Server 查询,它在 SQL Server 管理工具中显示以下结果:
loc L M S XL
1 001 1 2 0 1
2 006 4 3 0 2
3 012 1 1 1 0
4 022 0 1 0 0
问题 1:为了在网页上显示此结果,我在 PHP 中创建了一个数组,但它显示了更多我不需要的数据(在每个尺寸 (L,M,S,XL) 之后,都有一个额外的数字数量再次显示)。
问题 2:是否可以按照我可以定义的方式对尺寸进行排序?尺寸应从小到大排序,例如:S - M - L - XL,而不是按字母顺序排列。(有时一个项目的尺寸以数字显示,从低到高完美排序,所以没问题。)
Array
(
[0] => Array
(
[Location Code] => 001
[0] => 001
[L] => 1
[1] => 1
[M] => 2
[2] => 2
[S] => 0
[3] => 0
[XL] => 1
[4] => 1
)
[1] => Array
(
[Location Code] => 006
[0] => 006
[L] => 4
[1] => 4
[M] => 3
[2] => 3
[S] => 0
[3] => 0
[XL] => 2
[4] => 2
)
[2] => Array
(
[Location Code] => 012
[0] => 012
[L] => 1
[1] => 1
[M] => 1
[2] => 1
[S] => 1
[3] => 1
[XL] => 0
[4] => 0
)
[3] => Array
(
[Location Code] => 022
[0] => 022
[L] => 0
[1] => 0
[M] => 1
[2] => 1
[S] => 0
[3] => 0
[XL] => 0
[4] => 0
)
)
SQL查询:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @item varchar(max);
DECLARE @open varchar(max);
SET @item = 291557
SET @open = 1
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME([size])
FROM (SELECT DISTINCT [size] FROM [db].[dbo].[table] WHERE [Item] = @item AND [Open] = @open) AS data
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT [Loc], ' + @ColumnName + '
FROM
(SELECT ROUND(CAST([Quantity] AS decimal (2,0)), 1) AS [QuantityRound], [Loc], [size] FROM [db].[dbo].[table]
WHERE [Item] = ''' + @item + ''' AND [Open] = ''' + @open + ''') x
PIVOT(SUM([QuantityRound])
FOR [size] IN (' + @ColumnName + ')) AS PVTTable ORDER BY [Loc] + 0 ASC'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
PHP 文件:
$ItemLedgerPivotQuery = "
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX);
DECLARE @ColumnName AS NVARCHAR(MAX);
DECLARE @SelectColumnNames AS NVARCHAR(MAX);
DECLARE @item varchar(max);
DECLARE @open varchar(max);
SET @item = '$ItemNo';
SET @open = 1;
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME([size])
FROM (SELECT DISTINCT [size] FROM [db].[dbo].[table] WHERE [Item No_] = @item AND [Open] = @open) AS data
SELECT @SelectColumnNames
= ISNULL(@SelectColumnNames + ',','')
+ 'ISNULL(' + QUOTENAME([size]) + ', 0) AS '
+ QUOTENAME([size])
FROM (SELECT DISTINCT [size] FROM [db].[dbo].[table] WHERE [Item No_] = @item AND [Open] = @open) AS data
SET @DynamicPivotQuery =
'SELECT [loc], ' + @SelectColumnNames + '
FROM
(SELECT ROUND(CAST([Remaining Quantity] AS decimal (2,0)), 1) AS [quantity], [loc], [size] FROM [db].[dbo].[table]
WHERE [Item No_] = ''' + @item + ''' AND [Open] = ''' + @open + ''') x
PIVOT(SUM([quantity])
FOR [size] IN (' + @ColumnName + ')) AS PVTTable ORDER BY [loc] + 0 ASC'
EXEC sp_executesql @DynamicPivotQuery";
$sth = $dbh->prepare($ItemLedgerPivotQuery);
$sth->execute();
$result = $sth->fetchAll();
echo '<table border="1">';
echo '<tr>';
foreach( $result as $key => $value )
{
if( is_array($value) )
{
foreach($value as $key => $column) {
echo ' <th colspan="1" style="width: 30px">'.$key.'</th>';
}
}
else
{
echo '<th colspan="1">Nothing</th>';
}
break;
}
echo '</tr>';
//Data
foreach( $result as $key => $value )
{
echo '<tr>';
if( is_array($value) )
{
foreach($value as $key => $column) {
echo '<td>'.$column.'</td>';
}
}
else
{
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
解决方案
您应该使用 FETCH_ASSOC 来指定您希望 PDO 返回一个关联数组
$sth->fetchAll(PDO::FETCH_ASSOC);
您应该能够使用 usort 以自定义方式排序 https://secure.php.net/manual/en/function.usort.php
推荐阅读
- winforms - Localized UserControl at Design Time
- android - Google Play Console says app has been published but the app cannot be found on the PlayStore
- python-3.6 - 如何删除基数为 10 的 int() 的无效文字:'10**5'
- ios13 - 暗模式和多窗口/场景
- python - 如何在python中返回void
- imagemagick - ImageMagick 如何将选项传递给 cwebp Linux
- android - Tasker:在 xml 文件中编辑 android 应用程序的设置
- storage - 我正在尝试使用rocksdb作为存储后端进行缓存
- mysql - Spring Boot MySQL Docker 引起:java.net.ConnectException:连接被拒绝(连接被拒绝)
- javascript - 无法从本地文件系统加载 pdf (IONIC 4 - Android)