SQL表,包括3层楼的所有可能的员工座位安排

问题描述 投票:-1回答:2

我正在尝试创建一个表格,显示我的员工所有可能的楼层分配方案。每层楼都有固定数量的座位,但每层楼的确切座位安排无关紧要。

我有30个员工,每个员工都有1-30之间的唯一Employee_ID。我有3个楼层,每个楼层都有固定数量的座位 - Floor1有5个,Floor2有15个,Floor3有10个。

我在Employee表(Employee_ID)和Arrangement表(Floor_Number,Seat_Number)之间尝试了一些不同的交叉连接,但是我在将结果组织到可能的场景中时遇到了麻烦。

任何有关如何构造此查询的帮助将非常感激。

编辑:下面更详细描述的数据

表 - 员工

    Employee_ID
    1
    2
    ...
    30

表 - 安排

    Floor_Number | Seat_Number
         1       |     1
         1       |     2
         1       |     3
         1       |     4
         1       |     5
         2       |     1
         2       |     2
         ...     |    ...
         2       |     15
         3       |     1
         3       |     2
         ...     |     ...
         3       |     10

期望的输出结构将如下表所示,所有可能的座位安排在3个楼层。我假设将有超过25个场景 - 这只是作为一个例子。

    Scenario |  Floor_Number | Seat_Number | Employee_ID
        1    |        1      |      1      |      1
        1    |        1      |      2      |      2
        1    |        1      |      3      |      3
        1    |        1      |      4      |      4
        1    |        1      |      5      |      5
        1    |        2      |      1      |      6
        .............................................
        25   |        1      |      1      |      17
        25   |        1      |      2      |      22
        25   |        1      |      3      |      3
sql sql-server
2个回答
1
投票

不是一个完整的答案。 只是一个座位数较少的例子。

即使只有9个座位,您也可以获得一系列场景。 30岁就会疯狂!

declare @Employees table (id int primary key);
insert into @Employees (id) values 
(1),(2),(3),(4),(5),(6),(7),(8),(9);

IF OBJECT_ID('tempdb..#Scenarios') IS NOT NULL DROP TABLE #Scenarios;
create table #Scenarios (id int primary key identity(1,1), f1e1 int, f1e2 int, f1e3 int, f1e4 int, f2e1 int, f2e2 int, f2e3 int, f3e1 int, f3e2 int);

INSERT INTO #Scenarios (f1e1, f1e2, f1e3, f1e4, f2e1, f2e2, f2e3, f3e1, f3e2)
SELECT DISTINCT 
 e1.id, e2.id, e3.id, e4.id, e5.id, e6.id, e7.id, e8.id, e9.id
FROM @Employees e1
JOIN @Employees e2 ON e2.id > e1.id
JOIN @Employees e3 ON e3.id > e2.id
JOIN @Employees e4 ON e4.id > e3.id
-- floor 2
JOIN @Employees e5 ON e5.id not in (e1.id, e2.id, e3.id, e4.id)
JOIN @Employees e6 ON e6.id not in (e1.id, e2.id, e3.id, e4.id) and e6.id > e5.id
JOIN @Employees e7 ON e7.id not in (e1.id, e2.id, e3.id, e4.id) and e7.id > e6.id
 -- floor 3
JOIN @Employees e8 ON e8.id not in (e1.id, e2.id, e3.id, e4.id, e5.id, e6.id, e7.id)
JOIN @Employees e9 ON e9.id not in (e1.id, e2.id, e3.id, e4.id, e5.id, e6.id, e7.id) and e9.id > e8.id
ORDER BY e1.id, e2.id, e3.id, e4.id, e5.id, e6.id, e7.id, e8.id, e9.id;

select count(*) as Total
from #Scenarios;

select top 3 *
from #Scenarios
order by id desc;

返回:

Total
1260

id      f1e1    f1e2    f1e3    f1e4    f2e1    f2e2    f2e3    f3e1    f3e2
1260    6       7       8       9       3       4       5       1       2
1259    6       7       8       9       2       4       5       1       3
1258    6       7       8       9       2       3       5       1       4

结果表的格式不同。 但仍有UNPIVOT。


0
投票

你应该部分地这样做。格式不同,但创建一个包含500亿个组合的表,每个组合30行是没有意义的。

首先,创建这个桌子,对于1楼,其中有5个人有不同的座位,30个楼层。一旦完成这个,你可以通过构建相同类型的脚本和剩余的25个来完成同样的练习。 IN @ floor_1子句。

如果您真的想要所有行,可以使用ID值交叉连接到@ floor_2表。

declare @Employees table (id int primary key);
insert into @Employees (id) values 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30);

declare @floor_1 table (
    id int primary key identity(1,1), 
    emp1 int, 
    emp2 int, 
    emp3 int, 
    emp4 int,
    emp5 INT
    )

INSERT INTO @floor_1
(emp1,emp2,emp3,emp4,emp5)
SELECT a.ID, b.ID, c.ID, d.ID, e.ID
FROM @Employees a
INNER JOIN @Employees b
ON b.ID > a.ID
INNER JOIN @Employees c
ON c.ID > b.ID
INNER JOIN @Employees d
ON d.ID > c.ID
INNER JOIN @Employees e
ON e.ID > d.ID
ORDER BY a.ID, b.ID, c.ID, d.ID, e.ID

SELECT * FROM @floor_1
© www.soinside.com 2019 - 2024. All rights reserved.