将行数据配对到列数据中

时间:2018-03-28 15:39:43

标签: sql-server pivot

我有一个以

形式返回数据的查询
$files = Get-AzureStorageFile -ShareName $shareName -Context $ctx | where {$_.GetType().Name -eq "CloudFile"}
foreach($file in $files) {
    $file.FetchAttributes();
    if ($file.Properties.LastModified -ge $fromDate) {
        # Download file
        Get-AzureStorageFileContent -File $file -Destination $downloadDir
    }
}

如何让它返回像

这样的数据
[SetID],[COLID],[DataValue],[Order].
1,1,'Value1',1
1,1,'Value2',2
1,1,'Value3',3
1,2,'value4',1
1,2,'Value5',2
1,2,'Value6',3

使用每个columnid标记的数据返回到列中。 答案似乎是某种支点,但我不是在寻找直接转换或单行答案。

1 个答案:

答案 0 :(得分:0)

为了能够将每个数据值放入单独的列中,您需要知道每个数据的 DataValues ColId的数量。您不能动态返回可变数量的列(除非您使用动态SQL动态构造查询),而且每行需要具有相同数量的列,否则表结构没有意义

这是一个可以快速测试的示例,它使用内存表。

根据表 MyTable

declare @MyTable table (SetId int, ColId int, DataValue varchar(20), [Order] int);

insert into @MyTable values (1,1,'Value1',1)
insert into @MyTable values (1,1,'Value2',2)
insert into @MyTable values (1,1,'Value3',3)
insert into @MyTable values (1,2,'Value4',1)
insert into @MyTable values (1,2,'Value5',2)
insert into @MyTable values (1,2,'Value6',3)

此查询将在单独的列中返回值:

select mt.SetId, 
        (  select top 1 m1.DataValue from @MyTable m1 
            where m1.SetId = mt.SetId and 
                    m1.[Order] = mt.[Order] and 
                    m1.ColId = 1 -- hard-coded ColId, you need to know its value
        ) 'val1', 
        (   select top 1 m1.DataValue from @MyTable m1 
            where m1.SetId = mt.SetId and 
                    m1.[Order] = mt.[Order] and 
                    m1.ColId = 2 -- same as above
        ) 'val2', mt.[Order]
from @MyTable mt
group by mt.SetId, mt.[Order]
  

结果:

+-----------------------------------+
| SetId | Val1    | Val2   | Order  |
|-------+---------+--------+--------|
|    1  | Value1  | Value4 |    1   |
|-------+---------+--------+--------|
|    1  | Value2  | Value5 |    2   |
|-------+---------+--------+--------|
|    1  | Value3  | Value6 |    3   |
+-----------------------------------+

但是,我建议将所有数据值填充到一列(由分隔符分隔),因为这将适用于任意数量的数据值。这是查询:

select  mt.SetId, 
        stuff(( select ', '+ m2.DataValue 
                from @MyTable m2 
                where   mt.SetId = m2.SetId and 
                        mt.[Order] = m2.[Order]
          FOR XML PATH('')) , 1, 2, '') 'DataValues',
        mt.[Order]
from @MyTable mt
group by mt.SetId, mt.[Order]
  

结果

+----------------------------------+
| SetId | DataValues       | Order |
|-------+------------------+-------|
|   1   | Value1, Value4   |   1   |
|-------+------------------+-------|
|   1   | Value2, Value5   |   2   |
|-------+------------------+-------|
|   1   | Value3, Value6   |   3   |
+-------+------------------+-------+