在SQL Server中将行中的值显示为列

时间:2018-09-15 09:47:24

标签: sql sql-server pivot-table

我的表格包含以下示例记录。

select value, FieldID 
from [values] 
where fieldid in (140996, 140997)

输出:

value Fieldid
--------------
101    140996
102    140996
       140996
Louis  140997
Khan   140997
Akabar 140997

我想将行中的上面的值显示为列,例如fieldid是输入参数,而Value列中没有任何行。

样本输出

Fieldid    value1  value2  value3
---------------------------------
140996      101     102       
140997      Louis   Khan   Akabar

2 个答案:

答案 0 :(得分:1)

您可以尝试使用条件聚合函数make pivot。

;WITH CTE AS(
   SELECT  *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
)

SELECT FieldId,
    MAX(CASE WHEN rn = 1 THEN value END),
    MAX(CASE WHEN rn = 2 THEN value END),
    MAX(CASE WHEN rn = 3 THEN value END)
FROM CTE
GROUP BY FieldId

sqlfiddle

编辑

如果要动态创建列。

您可以尝试使用动态数据透视。

使用CTE递归使行号从最小行到最大行。

然后使用行号写条件聚合函数SQL。

DECLARE @cols AS NVARCHAR(MAX) = '',
        @query AS NVARCHAR(MAX);


;WITH CTE AS(
   SELECT  *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
), CTE2 AS (
   SELECT MIN(rn) minID,MAX(rn) maxID
   FROM CTE
   UNION ALL
   SELECT minID + 1,maxID
   FROM CTE2
   WHERE  minID + 1<=maxID
)

SELECT @cols = @cols + 'MAX(CASE WHEN rn ='+ cast(minID as varchar(5)) +' THEN value END) Value'+CAST(minID AS VARCHAR(5))+','
FROM CTE2

set @cols = substring(@cols,0,len(@cols))


set @query =  '
;WITH CTE AS(
   SELECT *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
)
 SELECT FieldId,' + @cols + ' 
 FROM CTE
 GROUP BY FieldId'


execute(@query)

sqlfiddle

答案 1 :(得分:0)

您可以对通过CONCAT和ROW_NUMBER生成的编号列进行PIVOT。

Route::get('/store/shopping-cart', 'onlineStore@showCart');
Route::get('/store/checkout', 'onlineStore@showCheckout');
Route::get('/store/checkout/payment', 'onlineStore@showPayment');
Route::get('/store/checkout/success', 'onlineStore@showPaymentSuccess');
Route::get('/store/checkout/error', 'onlineStore@showPaymentError');
Route::get('/store/{category}', 'onlineStore@showCategory');
Route::get('/store/{category}/{product}', 'onlineStore@showProductDetails');
Route::get('{article}', 'articles@showArticle');

您可以here对其进行测试

请注意,无序的顺序不会保证值的顺序相同。因此,如果表具有主键,则可以按此顺序进行排序。