У меня есть запрос 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
Ой, спасибо! Я попробовал это в другом запросе, совершенно забыл, что это может быть решением! Я собираюсь взглянуть на функцию usort.