行到列 SQL Server 查询

问题描述 投票:0回答:1

我正在编写一个将在 .NET 应用程序中使用的查询,因此我希望 SQL Server 2008 为我而不是运行该应用程序的客户端 PC 执行大部分处理。

我正在尝试从具有索引值的单个表中获取数据,根据该索引值,我希望将该项目放置在特定列中。

这是一个例子:

表 MAS:

MA      SN      Mindex
B275    7A1515  1
B276    7A1515  2
E530    7A1515  3
B291    7A1519  1
B292    7A1519  2
E535    7A1519  3
B301    7A2515  1
B302    7A2515  2
B331    7A2519  1
B332    7A2519  2

这是我想要的输出:

 SN      mi1     mi2     mi3
 7A1515  B275    B276    E530
 7A1519  B291    B292    E535
 7A2515  B301    B302    null
 7A2519  B331    B332    null

我尝试执行以下查询,它适用于具有 3 个索引的项目,但如果只有两个,则会用随机数据填充它。

 select mas1.SN, mas1.MA as mi1,mas2.MA as mi2, mas3.MA as mi3
 from MAS ma1, MAS ma2, MAS ma3
 where mas1.SN = '7A1515' and mas1.Mindex = '1' and mas2.Mindex = '2' and mas3.Mindex = '3'

我想知道是否有人能够为我指明正确的方向,因为我在编写这些高级查询方面还相当陌生。

sql sql-server select
1个回答
5
投票

当您使用 SQL Server 2008 时,您也可以使用

PIVOT
,但在我看来,旧式的做法通常更容易。

SELECT 
    SN,
    MAX(CASE WHEN Mindex=1 THEN MA END) AS mi1,
    MAX(CASE WHEN Mindex=2 THEN MA END) AS mi2,
    MAX(CASE WHEN Mindex=3 THEN MA END) AS mi3
FROM MAS
GROUP BY SN     

为了完整起见,带有

PIVOT
...

的版本
SELECT SN,
       P.[1] AS mi1,
       P.[2] AS mi2,
       P.[3] AS mi3
/*Should ensure PIVOT source only projects columns that you want to use 
for grouping, aggregation or pivoting so not using MAS directly to avoid 
unwanted "extra" implicit grouping columns should table get columns added
*/
FROM (SELECT SN, Mindex, MA FROM MAS) PivotSource
PIVOT (MAX(MA) FOR Mindex IN ([1],[2],[3])) AS P
© www.soinside.com 2019 - 2024. All rights reserved.