SQL Server 2012的T-SQL:跨表将查询转换为列的查询?
单刀直入,这就是我想要做的事:
用户表
id username fullname
---- -------- ----------------------
1 test0001 Test User #1
2 test0002 Test User #2
3 test0003 Test User #3
4 test0004 Test User #4
旗表
id name description
--- ---------- -------------------------------------------
1 isActive true if user is currently active
2 isAdmin true if user can do Admin things
3 canEdit true if user can can edit
UserFlags表
user flag
---- ----
1 1
1 2
1 3
2 1
2 3
3 1
(user = FK to user.id, flag = FK to flag.id)
期望结果
userId username isActive isAdmin canEdit
------ -------- -------- ------- -------
1 test0001 1 1 1
2 test0002 1 0 1
3 test0003 1 0 0
4 test0004 0 0 0
总之欲每个标志转换在标志表到柱与用作列标题中的name
字段。然后我想为每个用户设置一行,每列中都有一个布尔值,表示他们是否拥有该特定标志。
这需要能够适应 - 例如,如果添加了另一个标志,则查询结果应该包含另一个标志名称作为其标题的列。
我宁愿做一个观点,但我很确定用表值函数。
我没有做过这样的事之前,所以我甚至不知道从哪里开始 - 我可以做一个完整的加盟在桌子上,并与每位用户的标志行结束了,但后来我想折叠所有这些都是按每个用户划分为一行。
编辑其中一个关键点是“能适应” - 最好的情形是查询建立响应时,会自动提取从标志表中的所有当前定义的标志。不必编辑查询不一定是坏事,但考虑以下情况:管理员允许一个新的标志添加到系统中的实例。插入新标志很容易,自动编辑存储的查询以反映这一点更加困难。如果那根本无法做到,那么解释为什么会有帮助。谢谢!
您将需要PIVOT最后一个表。你试过什么了? – Eli
我现在正在做的就是调用一个UDF,我写到询问“用户X是否有标记Y”。然后,我为每个用户反复调用该函数,每个标志基本上最后都会有一个表,每个用户每个标志用一个布尔值表示一行。正如我在下面的评论中所说的,这里的所有解决方案都有效,但需要修改查询本身以处理更多标志。我正在寻找PIVOT,看看它是否有可能用它来完成。 – fdmillion
有两个答案可以帮助您:Kannan提供了PIVOT答案,而lostmylogin提供了更简单的非PIVOT答案。两者都应该解决你的问题。 – Eli