我正在学习,我被困在这个练习中。我只是不明白为什么结果会不同,哪种方法是正确的。
我有这些表及其属性:
departamentos:科迪戈县
empleados:codigo,nombre,hijos,retencion,cuenta,fnacimiento
just_nominas:输入,输入,描述,代码_emp
线:数字,悬臂,基础,分量,命令,代码_emp
工作:cod_emp,cod_dep,funcion
英语:
表***“部门”***:
属性:
**编码:**代表部门的唯一编码。**名称:**表示部门名称。
此表存储有关组织中存在的部门的信息
表***“员工”***:
属性:
**编码:**代表员工的唯一编码。
**姓名:**为员工姓名。
**子女:**指定员工的子女数量。
**预扣:**表示员工工资的预扣。
**账户:**代表员工的银行账号。
**Fnacimiento:**表示员工的出生日期。
此表包含员工的信息,例如他们的个人数据、财务信息和其他相关详细信息。
表***“just_payroll”***:
属性:
**月份:**表示工资单对应的月份。
**会计年度:**表示工资单对应的年度或会计年度。
**收入:**指定工资单中的收入。
**折扣:**表示适用于工资单的折扣。
**Cod_emp:**表示工资单所属员工的编码。
此表存储工资单数据,包括收入、扣减额以及与相应员工的关联。
表***“行”***:
属性:
**编号:**表示行号。
**数量:**表示该行关联的数量。
**基数:**指定计算基数。
**百分比:**表示应用的百分比。
**月份:**表示该行对应的月份。
**年度:**表示该行对应的年度或会计年度。
**Cod_emp:**代表该行所属职员的编码。
此表存储有关与工资单关联的行的详细信息,包括金额、计算基数和应用百分比等详细信息。
表***“工作”***:
属性:
**Cod_emp:**代表员工的编码。
**Cod_dep:**表示部门的编码。
**职能:**表示员工在部门中的职能或角色。
此表建立了员工和部门之间的关系,指明哪些员工在哪些部门工作,执行哪些职能。
这些表一起允许存储与部门、员工、工资单和关联行相关的数据,并建立这些数据之间的关系。
这个问题是这样告诉我们的:员工姓名和按姓名分组的总收入
我试着这样做查询:
SELECT NOMBRE,
SUM(CANTIDAD)
FROM EMPLEADOS A
JOIN JUST_NOMINAS B ON (A.CODIGO=B.COD_EMP)
JOIN LINEAS C ON (B.COD_EMP=C.COD_EMP)
GROUP BY NOMBRE;
但一位同事告诉我,不是这样的,而是这样的:
SELECT E.NOMBRE,
SUM(L.CANTIDAD) AS INGRESOS_TOTALES
FROM EMPLEADOS E
JOIN JUST_NOMINAS J ON E.CODIGO = J.COD_EMP
JOIN LINEAS L ON J.MES = L.MES
AND J.EJERCICIO = L.EJERCICIO
AND J.COD_EMP = L.COD_EMP
GROUP BY E.NOMBRE;
结果变化很大,例如,员工1给我:16000
而对他来说,结果是4000
我想知道是否有必要使用那些“和”以及为什么。
测试脚本:
CREATE TABLE empleados (
codigo NUMBER(5,0),
nombre VARCHAR2(30) NOT NULL,
hijos NUMBER(2,0) NOT NULL,
retencion NUMBER(2,0) NOT NULL,
cuenta CHAR(20) NOT NULL UNIQUE,
PRIMARY KEY (codigo));
CREATE TABLE departamentos (
codigo NUMBER(5,0),
nombre VARCHAR2(20) NOT NULL UNIQUE,
PRIMARY KEY (codigo));
CREATE TABLE trabajan (
cod_emp NUMBER(5,0),
cod_dep NUMBER(5,0),
funcion VARCHAR2(30) NOT NULL,
PRIMARY KEY (cod_emp, cod_dep),
FOREIGN KEY (cod_emp) REFERENCES empleados(codigo),
FOREIGN KEY (cod_dep) REFERENCES departamentos(codigo));
CREATE TABLE just_nominas (
mes NUMBER(2,0),
ejercicio NUMBER(4,0),
ingreso NUMBER(8,0) NOT NULL,
descuento NUMBER(8,0) NOT NULL,
cod_emp NUMBER(5,0),
PRIMARY KEY (mes, ejercicio, cod_emp),
FOREIGN KEY (cod_emp) REFERENCES empleados(codigo));
CREATE TABLE lineas (
numero NUMBER(5,0),
cantidad NUMBER(8,0) NOT NULL,
base NUMBER(8,0),
porcentaje NUMBER(2,0),
mes NUMBER(2,0),
ejercicio NUMBER(4,0),
cod_emp NUMBER(5,0),
PRIMARY KEY (numero, mes, ejercicio, cod_emp),
FOREIGN KEY (mes, ejercicio, cod_emp) REFERENCES just_nominas(mes, ejercicio, cod_emp));
//empleados
INSERT INTO empleados VALUES (00011, 'Juan Ignacio Martinez', 0, 10, '12341234121234567890');
INSERT INTO empleados VALUES (00001, 'José Luis Pérez', 2, 12, '12342233121122334455');
INSERT INTO empleados VALUES (02341, 'Fernando Romero Díaz', 1, 8, '21341234560987654321');
INSERT INTO empleados VALUES (11223, 'Manuel Lopez Marín', 0, 10, '55443322110099887766');
INSERT INTO empleados VALUES (67890, 'Alfonso Gutierrez Lopez', 1, 12, '12563478001234567890');
INSERT INTO empleados VALUES (00111, 'Encarna Lopez Lopez', 0, 10, '99118822773344665500');
INSERT INTO empleados VALUES (02031, 'Ines Montero Zafra', 1, 8, '42341534129234567890');
INSERT INTO empleados VALUES (09876, 'Rosa Lorite Lopez', 0, 10, '52341234521214567890');
INSERT INTO empleados VALUES (96352, 'Lola Martinez Contreras', 1, 11, '22341224121224567820');
INSERT INTO empleados VALUES (76543, 'Francisca Colate Gonzalez', 3, 7, '12343234121334567893');
INSERT INTO empleados VALUES (73152, 'María Pascual Rojo', 3, 7, '12351234151234567590');
INSERT INTO empleados VALUES (64738, 'Andrés Morales Martín', 3, 7, '22341154116231563690');
//departamentos
INSERT INTO departamentos VALUES (00001, 'Ventas');
INSERT INTO departamentos VALUES (00002, 'Compras');
INSERT INTO departamentos VALUES (00003, 'Marketing');
INSERT INTO departamentos VALUES (00004, 'Recursos Humanos');
INSERT INTO departamentos VALUES (00005, 'Administración');
INSERT INTO departamentos VALUES (00006, 'Dirección');
//trabajan
INSERT INTO trabajan VALUES (00001, 00001, 'Vendedor');
INSERT INTO trabajan VALUES (00001, 00003, 'Diseñador');
INSERT INTO trabajan VALUES (02341, 00005, 'Administrativo');
INSERT INTO trabajan VALUES (11223, 00006, 'Asesor Dirección');
INSERT INTO trabajan VALUES (11223, 00005, 'Administrativo');
INSERT INTO trabajan VALUES (11223, 00004, 'Selección de Personal');
INSERT INTO trabajan VALUES (67890, 00002, 'Gestor de compras');
INSERT INTO trabajan VALUES (00111, 00001, 'Vendedor');
INSERT INTO trabajan VALUES (02031, 00001, 'Vendedor');
INSERT INTO trabajan VALUES (09876, 00006, 'Director');
INSERT INTO trabajan VALUES (96352, 00003, 'Publicista');
INSERT INTO trabajan VALUES (96352, 00004, 'Encuestador');
INSERT INTO trabajan VALUES (96352, 00005, 'Secretaria de Dirección');
INSERT INTO trabajan VALUES (76543, 00001, 'Vendedor');
INSERT INTO trabajan VALUES (73152, 00005, 'Administrativo');
INSERT INTO trabajan VALUES (73152, 00003, 'Publicista');
INSERT INTO trabajan VALUES (64738, 00001, 'Vendedor');
INSERT INTO trabajan VALUES (64738, 00004, 'Selección de Personal');
INSERT INTO trabajan VALUES (64738, 00002, 'Gestor de compras');
INSERT INTO trabajan VALUES (64738, 00003, 'Diseñador');
INSERT INTO trabajan VALUES (00011, 00003, 'Diseñador');
//justificantes de nóminas
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 00001);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 00001);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 00001);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 00001);
INSERT INTO just_nominas VALUES (10, 2006, 1500, 300, 02341);
INSERT INTO just_nominas VALUES (11, 2006, 1500, 300, 02341);
INSERT INTO just_nominas VALUES (12, 2006, 1500, 300, 02341);
INSERT INTO just_nominas VALUES (01, 2007, 1500, 300, 02341);
INSERT INTO just_nominas VALUES (10, 2006, 1000, 100, 11223);
INSERT INTO just_nominas VALUES (11, 2006, 1000, 100, 11223);
INSERT INTO just_nominas VALUES (12, 2006, 1000, 100, 11223);
INSERT INTO just_nominas VALUES (01, 2007, 1000, 100, 11223);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 67890);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 67890);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 67890);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 67890);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 00111);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 00111);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 00111);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 00111);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 02031);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 02031);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 02031);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 02031);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 09876);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 09876);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 09876);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 09876);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 96352);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 96352);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 96352);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 96352);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 76543);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 76543);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 76543);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 76543);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 73152);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 73152);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 73152);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 73152);
INSERT INTO just_nominas VALUES (10, 2006, 1200, 200, 64738);
INSERT INTO just_nominas VALUES (11, 2006, 1200, 200, 64738);
INSERT INTO just_nominas VALUES (12, 2006, 1200, 200, 64738);
INSERT INTO just_nominas VALUES (01, 2007, 1200, 200, 64738);
//lineas
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 00001);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 00001);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 00001);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 00001);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 00001);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 00001);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 00001);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 00001);
INSERT INTO lineas VALUES (00001, 1500, NULL, NULL, 10, 2006, 02341);
INSERT INTO lineas VALUES (00002, -300, 1200, 10, 10, 2006, 02341);
INSERT INTO lineas VALUES (00001, 1500, NULL, NULL, 11, 2006, 02341);
INSERT INTO lineas VALUES (00002, -300, 1200, 10, 11, 2006, 02341);
INSERT INTO lineas VALUES (00001, 1500, NULL, NULL, 12, 2006, 02341);
INSERT INTO lineas VALUES (00002, -300, 1200, 10, 12, 2006, 02341);
INSERT INTO lineas VALUES (00001, 1500, NULL, NULL, 01, 2007, 02341);
INSERT INTO lineas VALUES (00002, -300, 1200, 10, 01, 2007, 02341);
INSERT INTO lineas VALUES (00001, 1000, NULL, NULL, 10, 2006, 11223);
INSERT INTO lineas VALUES (00002, -100, 1200, 10, 10, 2006, 11223);
INSERT INTO lineas VALUES (00001, 1000, NULL, NULL, 11, 2006, 11223);
INSERT INTO lineas VALUES (00002, -100, 1200, 10, 11, 2006, 11223);
INSERT INTO lineas VALUES (00001, 1000, NULL, NULL, 12, 2006, 11223);
INSERT INTO lineas VALUES (00002, -100, 1200, 10, 12, 2006, 11223);
INSERT INTO lineas VALUES (00001, 1000, NULL, NULL, 01, 2007, 11223);
INSERT INTO lineas VALUES (00002, -100, 1200, 10, 01, 2007, 11223);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 67890);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 67890);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 67890);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 67890);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 67890);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 67890);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 67890);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 67890);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 00111);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 00111);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 00111);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 00111);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 00111);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 00111);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 00111);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 00111);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 02031);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 02031);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 02031);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 02031);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 02031);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 02031);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 02031);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 02031);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 09876);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 09876);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 09876);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 09876);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 09876);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 09876);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 09876);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 09876);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 96352);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 96352);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 96352);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 96352);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 96352);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 96352);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 96352);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 96352);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 76543);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 76543);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 76543);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 76543);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 76543);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 76543);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 76543);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 76543);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 73152);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 73152);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 73152);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 73152);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 73152);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 73152);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 73152);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 73152);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 10, 2006, 64738);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 10, 2006, 64738);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 11, 2006, 64738);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 11, 2006, 64738);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 12, 2006, 64738);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 12, 2006, 64738);
INSERT INTO lineas VALUES (00001, 1200, NULL, NULL, 01, 2007, 64738);
INSERT INTO lineas VALUES (00002, -200, 1200, 10, 01, 2007, 64738);
ALTER SESSION SET nls_date_format='DD/MM/YYYY';
ALTER TABLE empleados ADD fnacimiento DATE;
UPDATE empleados SET fnacimiento = TO_DATE('01/02/1960', 'DD/MM/YYYY') WHERE codigo = 00011;
UPDATE empleados SET fnacimiento = TO_DATE('12/04/1964', 'DD/MM/YYYY') WHERE codigo = 00001;
UPDATE empleados SET fnacimiento = TO_DATE('25/09/1955', 'DD/MM/YYYY') WHERE codigo = 02341;
UPDATE empleados SET fnacimiento = TO_DATE('13/12/1963', 'DD/MM/YYYY') WHERE codigo = 11223;
UPDATE empleados SET fnacimiento = TO_DATE('05/11/1967', 'DD/MM/YYYY') WHERE codigo = 67890;
UPDATE empleados SET fnacimiento = TO_DATE('15/03/1968', 'DD/MM/YYYY') WHERE codigo = 00111;
UPDATE empleados SET fnacimiento = TO_DATE('22/02/1972', 'DD/MM/YYYY') WHERE codigo = 02031;
UPDATE empleados SET fnacimiento = TO_DATE('18/08/1975', 'DD/MM/YYYY') WHERE codigo = 09876;
UPDATE empleados SET fnacimiento = TO_DATE('09/03/1975', 'DD/MM/YYYY') WHERE codigo = 96352;
UPDATE empleados SET fnacimiento = TO_DATE('02/03/1969', 'DD/MM/YYYY') WHERE codigo = 76543;
UPDATE empleados SET fnacimiento = TO_DATE('09/12/1973', 'DD/MM/YYYY') WHERE codigo = 73152;
UPDATE empleados SET fnacimiento = TO_DATE('20/01/1964', 'DD/MM/YYYY') WHERE codigo = 64738;
COMMIT;
1条答案
按热度按时间z9ju0rcb1#
您在查询中只使用了3个表。通过在线翻译器运行它们可以翻译为:
致:
我们不清楚“行”是否与收入有关,因此您可能只需要两个表:
密码:
是不正确的。
在三列
month
、year
和cod_emp
上的行表和工资表之间存在复合外键约束,并且您只连接一列cod_emp
上的表这意味着,对于第一个员工,将2006-10的
payroll
行连接到2006-10、2006-11、2006-12和2007-01的line
行(因为您只匹配员工编号,而不匹配月份和年份),同样,该员工的其他payroll
行也连接到所有四个line
行,因此您得到的行数是同事的四倍,这就是为什么总数是同事的四倍。这也不意味着你同事的代码是正确的;如前所述,似乎不需要使用
line
表,只需使用employees
和payroll
表即可获得income
列的总和。如果你想得到折扣的总数(这似乎不是问题所问的),那么,是的,你同事的代码可能是正确的。(虽然
line
数据有点奇怪,因为当base
是1200,percentage
是10时,discount
列是-200
,这是16.7%而不是10%。