C# 如何简化从excel到sqlite的查询?

C# 如何简化从excel到sqlite的查询?,c#,sqlite,C#,Sqlite,如何在sqlite中实现相同的结果 在excel中,我有一个每天根据指定的字母代码计算员工人数的方法: 这是我的excel公式:=SUMIF(G$2:G$5,E9$E$2:E$5) 在我的Sqlite数据库中,我有3个表: TABLE 1 +----------------+---------------+--------+ | ID | status_name | status_code | status | +----+-------------+-------------+------

如何在sqlite中实现相同的结果

在excel中,我有一个每天根据指定的字母代码计算员工人数的方法:

这是我的excel公式:
=SUMIF(G$2:G$5,E9$E$2:E$5)

在我的Sqlite数据库中,我有3个表:

TABLE 1
+----------------+---------------+--------+
| ID | status_name | status_code | status |
+----+-------------+-------------+--------+
| 1  | Available   | A           | true   |
+------------------+-------------+--------+
| 2  | HalfDay     | H           | true   |
+------------------+-------------+--------+
| 3  | On Leave    | OL          | true   |            
+------------------+-------------+--------+
| 4  | Restday     | R           | true   |            
+------------------+-------------+--------+
| 5  | Vacation    | V           | true   |            
+------------------+-------------+--------+

TABLE 2
+--------------+-------+-------+------+----------+
| EmployeeName | Site  | Shift | Team | JobTitle |
+--------------+-------+-------+------+----------+
| Steve        | Bldg1 | Night | N1   | Doctor   |
+--------------+-------+-------+------+----------+
| Dave         | Bldg1 | Night | N2   | Nurse    | 
+--------------+-------+-------+------+----------+
| Jack         | Bldg1 | Night | N2   | Nurse    |
+--------------+-------+-------+------+----------+
| Jacob        | Bldg2 | Day   | D1   | Doctor   |
+--------------+-------+-------+------+----------+
| Noah         | Bldg2 | Day   | D2   | Nurse    | 
+--------------+-------+-------+------+----------+
| MAX          | Bldg2 | Day   | D2   | Nurse    | 
+--------------+-------+-------+------+----------+

TABLE 3
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
| JobsType | Site  | Shift | Team | SUN | MON | TUE | WED | THU | FRI | SAT |
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
| Doctor   | Bldg1 | Night | N1   | A   | H   | A   | A   | OL  | A   | A   |
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
| Nurse    | Bldg1 | Night | N2   | A   | H   | H   | A   | A   | A   | A   |
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
| Doctor   | Bldg2 | Day   | D1   | H   | A   | H   | H   | A   | A   | OL  |
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
| Nurse    | Bldg1 | Night | N2   | A   | H   | H   | A   | A   | A   | A   |
+----------+-------+-------+------+-----+-----+-----+-----+-----+-----+-----+
通过使用上面的3个表,我如何在查询中获得这个结果

+--------------+-----+-----+-----+-----+-----+-----+-----+
| STATUS TYPES | SUN | MON | TUE | WED | THU | FRI | SAT |
+--------------+-----+-----+-----+-----+-----+-----+-----+
| Available    | 5   | 4   | 4   | 5   | 5   | 6   | 5   |
+--------------+-----+-----+-----+-----+-----+-----+-----+
| HalfDay      | 1   | 5   | 5   | 1   | 0   | 0   | 0   |
+--------------+-----+-----+-----+-----+-----+-----+-----+
| On Leave     | 0   | 0   | 0   | 0   | 1   | 0   | 1   |
+--------------+-----+-----+-----+-----+-----+-----+-----+
| Restday      | 0   | 0   | 0   | 0   | 0   | 0   | 0   |
+--------------+-----+-----+-----+-----+-----+-----+-----+
| Vacation     | 0   | 0   | 0   | 0   | 0   | 0   | 0   |
+--------------+-----+-----+-----+-----+-----+-----+-----+
到目前为止,我已经来到这里


    SELECT DISTINCT M.status_name, M.status_code, A.SUN, count(*),count(*) FROM TABLE3 M LEFT join TABLE2 A ON M.status_code= A.SUN LEFT join TABLE2 B ON (A.Team = B.Team AND A.Shift = B.Shift AND A.Site = B.Site)  
WHERE M.product_status = 1  
GROUP BY M.status_name;


第一步,生成一个测试数据库(带有几个有用的索引):

创建表状态(id整数主键、状态名称文本、状态代码文本、状态文本);
插入状态值(1、'Available'、'A'、'true');
插入状态值(2、'半天'、'H'、'true');
在状态值中插入(3、'On Leave'、'OL'、'true');
插入状态值(4、'Restday'、'R'、'true');
插入状态值(5,'Vacation','V','true');
创建表EmployeeName文本、站点文本、轮班文本、团队文本、职务标题文本);
在员工价值观中插入('Steve'、'Bldg1'、'Night'、'N1'、'Doctor');
在员工值中插入('Dave'、'Bldg1'、'Night'、'N2'、'Nurse');
在员工价值观中插入('Jack'、'Bldg1'、'Night'、'N2'、'Nurse');
在员工价值观中插入('Jacob'、'Bldg2'、'Day'、'D1'、'Doctor');
在员工价值观中插入('Noah'、'Bldg2'、'Day'、'D2'、'Nurse');
在员工值中插入('MAX'、'Bldg2'、'Day'、'D2'、'Nurse');
创建表格明细表(作业类型文本、站点文本、轮班文本、团队文本、太阳文本、周一文本、周二文本、周三文本、周四文本、周五文本、周六文本);
在明细表值中插入('Doctor'、'Bldg1'、'Night'、'N1'、'A'、'H'、'A'、'A'、'OL'、'A'、'A');
在明细表值中插入('Nurse','Bldg1','Night','N2','A','H','H','A','A','A','A');
在明细表值中插入('Doctor'、'Bldg2'、'Day'、'D1'、'H'、'A'、'H'、'H'、'A'、'A'、'OL');
在明细表值中插入('Nurse','Bldg1','Night','N2','A','H','H','A','A','A','A');
在员工(职位、地点、班次、团队)上创建员工索引;
在状态上创建索引状态代码(状态代码);
此查询:

选择st.status\u名称、st.status\u代码
,总和(sc.SUN=st.status\U代码)为SUN
,总和(sc.MON=st.status\u code)为MON
,总和(sc.TUE=st.status_代码)为TUE
,和(sc.WED=st.status_代码)为WED
,总和(sc.THU=st.status_代码)为THU
,总和(sc.FRI=st.status_代码)为FRI
,总和(sc.SAT=st.status\U代码)为SAT
从圣
以sc的身份加入进度表(sc.SUN、sc.MON、sc.TUE、sc.WED)
,理大四、理大五、理大六)
在sc.JobsType=e.JobsTitle和sc.Site=e.Site中加入员工作为e
和sc.Shift=e.Shift和sc.Team=e.Team
按st.status\u名称、st.status\u代码分组
按st.status\u名称、st.status\u代码订购;
将产生

status\u name status\u code太阳周一周二周三周四周五周六
-----------  -----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------
有511565
半天H15500
休假OL 0 0 0 1 0 1
工作原理:

对于状态表中的每一行,连接计划表中至少一天具有该状态的每一行,然后连接employee表中与每个计划行的作业类型匹配的所有行(使用此示例数据,总共生成14行)。然后对状态上的所有行进行分组,对于每一天,将该组中当天的计划代码与状态匹配的行数相加