Sql 我可以避免使用UNIONALL语句吗?

Sql 我可以避免使用UNIONALL语句吗?,sql,sql-server,tsql,unpivot,Sql,Sql Server,Tsql,Unpivot,我从一个系统中提取了一个数据,它以以下格式在excel中显示数据: 我用冗长的工会声明得出以下结果: 我想知道有没有比一大堆union all语句更简单易读的更好方法?如果您使用的是SQL Server,那么交叉应用将是比union all语句更好的方法 select a.* from table t cross apply ( values (PersonId, 'Q1', Q1) ,(PersonId, 'Q2', Q2)

我从一个系统中提取了一个数据,它以以下格式在excel中显示数据:

我用冗长的工会声明得出以下结果:


我想知道有没有比一大堆union all语句更简单易读的更好方法?

如果您使用的是
SQL Server
,那么交叉应用将是比
union all
语句更好的方法

select a.* from table t
cross apply (
       values (PersonId, 'Q1', Q1)
             ,(PersonId, 'Q2', Q2)
             ,(PersonId, 'Q3', Q3)
             ,(PersonId, 'Q4', Q4)
               ...
               ...
             ,(PersonId, 'Q20', Q20)
)a(PersonId, Q, Outcome)
order by a.Q, a.PersonId

您可以使用left join或right join如果需要输出,您需要查找PIVOT和UNPIVOT的定义。当然,实现取决于您的RDBMS,但概念是相同的。我猜想,一旦您用所选的RDBMS供应商正确地标记了您的问题,您将获得更多的答案。或者有人会指出你的问题已经在别处得到了回答。你正在使用哪种产品?博士后?神谕“SQL”只是一种查询语言,不是特定数据库产品的名称。请阅读并接受答案唯一的问题是我有数千个personID,只有20个questions@NS01.. 不知道你有多少个人id。
cross-apply
是非标准SQL,目前这个问题只标记了
SQL
而不是特定的数据库产品。这非常有效!非常感谢。如果我想引用另一个有更多问题和答案的表怎么办?@NS01。。。但是,如果您想引用另一个表,那么您应该加入它们并引用
PersonId
。。如果有更多问题,您可以编辑该问题或询问其他问题。因为如果没有清晰的路线图或者你到底想要什么,就很难判断。