Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 终端用户报表的快速查询_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 终端用户报表的快速查询

Sql 终端用户报表的快速查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,在项目中,用户可以为事件预订房间。在一种情况下,我们可以有多个房间(tblEventTimePeriodRoom)的多个预订(tblEventTimePeriodRoom) 我有这样的数据库结构。我删除了不必要的列以简化示例 tblEvent (ID, Name) tblEventTimePeriod (ID, EventId) tblEventTimePeriodRoom (ID, EventTimePeriodId, RoomId) 表之间的关系: tblEvent to tblEven

在项目中,用户可以为事件预订房间。在一种情况下,我们可以有多个房间(tblEventTimePeriodRoom)的多个预订(tblEventTimePeriodRoom) 我有这样的数据库结构。我删除了不必要的列以简化示例

tblEvent (ID, Name) 
tblEventTimePeriod (ID, EventId)
tblEventTimePeriodRoom (ID, EventTimePeriodId, RoomId)
表之间的关系:

tblEvent to tblEventTimePeriod -> One to many
tblEventTimePeriod to tblEventTimePeriodRoom -> many to many
对于本例,RoomId可以取1到5之间的值。在实际项目中,它有40个不同的值(其他表中的键),我必须在报告中显示为列

我的问题是-如何构建快速查询以获得以下结果:

EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5
RoomId_X-meens than Event已预订RoomId=X。哪个tblEventTimePeriod有此预订并不重要

实际的解决方案是使用标量UDF(用户定义函数)来获取此信息。起初还可以,但现在执行时间不可接受。事实上,对于每一行(tblEvent),它都执行子查询tblEventTimePeriodRoom以检查行是否存在。当报表有40列时。。。。无可奉告:)

如果有任何提示,我将不胜感激!我正在使用SQLServer2008R2

示例数据:

tblEvent:
----------
Id | Name
----------
1 | Event1
2 | Event2
3 | Event3

tblEventTimePeriod:
------------
Id | EventId
------------
12 | 1
13 | 2
14 | 2
15 | 3

tblEventTimePeriodRoom
-------------------------------
Id | EventTimePeriodId | RoomId
-------------------------------
110 | 15 | 1
111 | 15 | 5
112 | 13 | 5
113 | 14 | 2
114 | 14 | 3
115 | 14 | 4
116 | 14 | 5
117 | 12 | 1

Result shoud be:
--------------------------------------------------------------------------
EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5
--------------------------------------------------------------------------
1 | Event1 | 1 | 0 | 0 | 0 | 0
2 | Event2 | 0 | 1 | 1 | 1 | 1
3 | Event3 | 0 | 0 | 0 | 0 | 1
致以最良好的祝愿

试试这个:

 /* outer query formats results */
 select EventID, EventName,
 case when RoomID = 1 then 1 else 0 end as Room1,
 case when RoomID = 2 then 1 else 0 end as Room2,
 case when RoomID = 3 then 1 else 0 end as Room3,
 case when RoomID = 4 then 1 else 0 end as Room4,
 case when RoomID = 4 then 1 else 0 end as Room5
 from (
          /* inner query makes the joins */
          select  b.eventid as EventID, a.name as EventName, c.roomid as RoomID
          from _event a inner join _eventTimePeriod b
          on a.id = b.eventid 
          inner join _eventTimePeriodRoom c 
          on c.eventtimeperiod = b.id
) v
order by EventID
我希望这对你有帮助


您是否可以在应用程序代码而不是sql中进行转换?您是否尝试过通过将每个事件连接到所有房间,设置房间是否已预订的指示器,然后使用PIVOT功能来选择数据@JoeFrambach报告机制使用视图/表值函数加载数据,所以我尝试更改实际视图。若我并没有找到有趣的解决方案,我将从视图(或视图,若需要)加载初始数据,然后按照您所说的进行转换。谢谢。@liebs19不,我没有尝试这个解决方案。你能给我发一个使用frpm数据的例子吗?我这么问是因为我不知道如何把房间标记为已预订。谢谢。将活动加入到所有可用房间的列表中。从这里,你可以离开加入保留,看看是否有一个不是。在这周围放置一个
isnull()。有关为轴生成列的动态方法,请参见此示例。那是我第一次使用SQL小提琴。。。漂亮的小web应用程序。@briandines我想这就是我要找的:)当然,我需要分组,每个事件只有一行。谢谢你,布莱恩!当我在现实生活中查看时,我会让你知道:)@Mr47我需要使用MAX而不是SUM,一个房间可以在同一事件中多次预订。听起来很合理。。。乐意help@briandines我做了测试。查询执行时间比oryginal短,但仅约为10-12%;/所以这个解决方案不是我想要的。最后,我用两个查询解决了这个问题。首先选择有关活动的所有必要信息,然后获取所有活动的所有预订。在应用程序代码中设置标志(已预订或未预订)。初始时间~1分钟,更改后:5秒:)谢谢大家!