Sql server 2008 r2 SQL Server 2008 R2 Management Studio转换行列不使用PIVOT(聚合)可以完成吗?

Sql server 2008 r2 SQL Server 2008 R2 Management Studio转换行列不使用PIVOT(聚合)可以完成吗?,sql-server-2008-r2,transform,rows,Sql Server 2008 R2,Transform,Rows,我不想创建聚合函数(sum,count,max)透视要求这样做 我的问题是,在我出生之前很久的人可能会将数据“读取”为两列,这两列实际上应该是每列1个值乘以“n”个记录的列数据 他们的数据集: (RECORDSET, NAME, VALUE) (1, FIELD1, char1-1) (1, FIELD2, char2-1) (1, FIELD3, int3-1) (1, FIELD4, char4-1) (…) (…) (…) (1, FIELD26, float26-1) (2, FIELD

我不想创建聚合函数(
sum,count,max
)<代码>透视要求这样做

我的问题是,在我出生之前很久的人可能会将数据“读取”为两列,这两列实际上应该是每列1个值乘以“n”个记录的列数据

他们的数据集:

(RECORDSET, NAME, VALUE)
(1, FIELD1, char1-1)
(1, FIELD2, char2-1)
(1, FIELD3, int3-1)
(1, FIELD4, char4-1)
(…)
(…)
(…)
(1, FIELD26, float26-1)
(2, FIELD1, char1-2)
(2, FIELD2, char2-2)
(2, FIELD3, int3-2)
(2, FIELD4, char4-2)
(…)
(…)
(…)
(2, FIELD26, float26-2)
(3, FIELD1, char1-3)
(3, FIELD2, char2-3)
(3, FIELD3, int3-3)
(3, FIELD4, char4-3)
(…)
(…)
(…)
(3, FIELD26, float26-3)
我需要每组26条记录如下:

FIELD1......FIELD2......FIELD3......FIELD4.............FIELD 26
char1-1.....char2-1.....int3-1......char4-1............float26-1
char1-2.....char2-2.....int3-2......char4-2............float26-2
char1-3.....char2-3.....int3-3......char4-3............float26-3
等等。

我会使用,所以我包括了pivot版本和一些其他选项

具有枢轴和聚合的版本

没有pivot但仍使用聚合的版本

没有支点也没有聚合

另一个无枢轴无聚合版本

我会使用,所以我包括了一个pivot版本和一些其他选项

具有枢轴和聚合的版本

没有pivot但仍使用聚合的版本

没有支点也没有聚合

另一个无枢轴无聚合版本


可以在值上使用pivot with max(),因为如果只有一个匹配行,则max(x)等于x,而在您的示例中,有一个匹配行。(记录集,名称)对我来说似乎是唯一的。您可以使用pivot with max()覆盖值,因为如果只有一个匹配行,则max(x)等于x,而在您的情况下,有一个匹配行。(记录集,名称)对我来说似乎是独一无二的。好吧,看来你提供了基本的转变,非常激动。现在我必须把它应用于“真实”世界(啊啊)。。。我会在今晚或明天通知你=o) ,请阅读上面的“另一个无枢轴无聚合版本。SE数据”----表示我的文本从何处开始。您应该真正使用
pivot
版本。正如您所看到的,结果是相同的,但性能要好得多,至少比前两个版本好得多,比第二个版本好一点。要使这项工作为您所用,您需要将
YourTable
替换为表的任何名称。看来您已经提供了基本的转换,非常激动。现在我必须把它应用于“真实”世界(啊啊)。。。我会在今晚或明天通知你=o) ,请阅读上面的“另一个无枢轴无聚合版本。SE数据”----表示我的文本从何处开始。您应该真正使用
pivot
版本。正如您所看到的,结果是相同的,但性能要好得多,至少比前两个版本好得多,比第二个版本好一点。要使这项工作为您所用,您需要将
YourTable
替换为表的任何名称。
select P.FIELD1, P.FIELD2, P.FIELD3, P.FIELD4
from YourTable T
pivot (min(T.VALUE) for T.NAME in (FIELD1, FIELD2, FIELD3, FIELD4)) P
select min(case when T.NAME = 'FIELD1' then T.VALUE end) as FIELD1,
       min(case when T.NAME = 'FIELD2' then T.VALUE end) as FIELD2,
       min(case when T.NAME = 'FIELD3' then T.VALUE end) as FIELD3,
       min(case when T.NAME = 'FIELD4' then T.VALUE end) as FIELD4
from (select RECORDSET, NAME, VALUE from YourTable) T
group by T.RECORDSET
select T.R.value('(VALUE[@Name = "FIELD1"])[1]', 'varchar(10)') as FIELD1,
       T.R.value('(VALUE[@Name = "FIELD2"])[1]', 'varchar(10)') as FIELD2,
       T.R.value('(VALUE[@Name = "FIELD3"])[1]', 'varchar(10)') as FIELD3,
       T.R.value('(VALUE[@Name = "FIELD4"])[1]', 'varchar(10)') as FIELD4
from
    (
      select (select T1.NAME as "@Name",
                     T1.VALUE as "*"
              from @T T1
              where T1.RECORDSET = T.RECORDSET
              for xml path('VALUE'), root('RECORDSET'), type)
      from YourTable T
      group by T.RECORDSET
      for xml path(''), type
    ) X(XML)
  cross apply X.XML.nodes('RECORDSET') as T(R)
select (select T2.VALUE
        from YourTable T2
        where T.RECORDSET = T2.RECORDSET and
              T2.NAME = 'FIELD1') as FIELD1,
       (select T2.VALUE
        from YourTable T2
        where T.RECORDSET = T2.RECORDSET and
              T2.NAME = 'FIELD2') as FIELD2,
       (select T2.VALUE
        from YourTable T2
        where T.RECORDSET = T2.RECORDSET and
             T2.NAME = 'FIELD3') as FIELD3,
       (select T2.VALUE
        from YourTable T2
        where T.RECORDSET = T2.RECORDSET and
             T2.NAME = 'FIELD4') as FIELD4
from YourTable T
group by T.RECORDSET