Sql 取消激活多个列

Sql 取消激活多个列,sql,tsql,unpivot,sql-server-2014,Sql,Tsql,Unpivot,Sql Server 2014,我在SQL Server 2014中有一个名为anotes的表,其中包含以下数据 我想把这些数据添加到另一个名为final的表中 ID Notes NoteDate 将text1、text2、text3、text4放入最终表格的Notes列,并将Notedate1、notedate2、notedate3、notedate4放入Notedate列 我首先尝试使用notes取消激活数据,如下所示: select createdid, temp from (select cre

我在SQL Server 2014中有一个名为
anotes
的表,其中包含以下数据

我想把这些数据添加到另一个名为final的表中

ID      Notes      NoteDate
text1、text2、text3、text4
放入最终表格的
Notes
列,并将
Notedate1、notedate2、notedate3、notedate4
放入
Notedate

我首先尝试使用notes取消激活数据,如下所示:

select createdid, temp
from (select createdid,text1,text2,text3,text4 from anotes) p
unpivot
(temp for note in(text1,text2,text3,text4)) as unpvt
order by createdid
这给了我正确的结果:

对于日期部分,我使用了另一个unpivot查询:

select createdid,temp2
from (select createdid,notedate1,notedate2,notedate3,notedate4 from anotes) p
unpivot (temp2 for notedate in(notedate1,notedate2,notedate3,notedate4)) as unpvt2
这也给了我适当的结果:

现在,我想将这些数据添加到最终的表中

我尝试了以下查询,结果是交叉连接:(

结果如下:

有没有办法可以同时取消两列的PIVOT

或者使用两个select查询将该数据添加到我的最终表中


提前感谢!

使用了@AHiggins提到的上述链接

下面是我的最后一个问题

select createdid,temp,temp2
from (select createdid,text1,text2,text3,text4,text5,text6,text7,notedate1,notedate2,notedate3,notedate4,notedate5,notedate6,notedate7 from anotes) main
      unpivot
      (temp for notes in(text1,text2,text3,text4,text5,text6,text7)) notes
unpivot (temp2 for notedate in(notedate1,notedate2,notedate3,notedate4,notedate5,notedate6,notedate7)) Dates
where RIGHT(notes,1)=RIGHT(notedate,1)

将每个查询视为一个表,并基于createdid和fieldid(字段名的数字部分)将它们连接在一起


如果列太多且字段名最右边的数字重复(例如text1和text11),则给出的另一个答案将不起作用。

我想说,取消多列的最简洁、可能也是最有效的方法是与一个:


附录

我发现这个概念很难解释,但我会尝试一下。表值构造函数只是一种动态定义表的方法,所以

SELECT  *
FROM    (VALUES (1, 1), (2, 2)) t (a, b);
将创建别名为t的表,其中包含以下数据:

a   b
------
1   1
2   2

因此,当您在应用程序中使用它时,您可以访问所有外部列,因此只需使用正确的值对定义构造的表(即带有date1的text1)。

尝试或只搜索SQL多个unpivotthank链接@AHiggins,效果非常好!太好了!将此问题标记为已回答(查看您自己答案旁边的复选框)以便系统识别问题已得到解决,祝您好运!哇,我认为您赢了。这确实表现得最好。现在我只需尝试并找出它的工作原理。
SELECT  t.CreatedID, upvt.Text, upvt.NoteDate
FROM    anotes t
        CROSS APPLY
        (VALUES
            (Text1, NoteDate1),
            (Text2, NoteDate2),
            (Text3, NoteDate3),
            (Text4, NoteDate4),
            (Text5, NoteDate5),
            (Text6, NoteDate6),
            (Text7, NoteDate7)
        ) upvt (Text, NoteDate);
SELECT  *
FROM    (VALUES (1, 1), (2, 2)) t (a, b);
a   b
------
1   1
2   2