我有两个表,我想要的结果,我已经提到以下。我使用的sql server 2012表如下:
emp
╔═══════╦═════════╦═════╦════════╗
║ empid ║ ename ║ sal ║ deptno ║
╠═══════╬═════════╬═════╬════════╣
║ 1 ║ vikrant ║ 5 ║ 1 ║
║ 2 ║ Nimesh ║ 2 ║ 1 ║
║ 3 ║ memo ║ 6 ║ 2 ║
║ 4 ║ sabir ║ 5 ║ 2 ║
╚═══════╩═════════╩═════╩════════╝部门
╔════════╦══════════════╗
║ deptno ║ dname ║
╠════════╬══════════════╣
║ 1 ║ Tech ║
║ 2 ║ Creative ║
╚════════╩══════════════╝ 成果/产出:共计6行
╔══════════╦═══╗
║ Tech ║ ║
║ Vikrant ║ 5 ║
║ Nimesh ║ 2 ║
║ Creative ║ ║
║ Memo ║ 6 ║
║ Sabir ║ 5 ║
╚══════════╩═══╝ 我希望在第一行技术中是部门名称,然后在该dpt中的第2行emp名称中,他/她的工资(即他/她的dpt名称)应该打印一次,然后再打印该dpt中所有emp的emp名称,abv只是一个例子。
发布于 2014-08-06 14:42:46
下一次,请通过发布到SQL的链接来帮助自己。
下面是另一个您可以使用的查询。分组集与UNION差不多,但更简洁。
SELECT dname,
ename,
CASE
WHEN ename IS NULL THEN dname
ELSE ename
END As [Dept/Employee],
CASE
WHEN ename IS NULL THEN ''
ELSE CONVERT(varchar(10),SUM(sal))
END As [Salary]
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno
GROUP BY GROUPING SETS (dname, (dname, ename))
ORDER BY dname, ename为了清晰起见,我向结果集添加了dname和ename列。在您的代码中删除它们。需要CONVERT(varchar(10),...),因为Salary列必须只有一个数据类型。如果选择int/float,部门级别的行将显示为0。所以我把它转换成varchar。
发布于 2014-08-08 08:42:30
您可以从两个单独的查询开始,一个返回员工及其薪资:
SELECT
ename,
sal
FROM
emp
;其他部门:
SELECT
dname
FROM
dept
;现在,您只需要将两个结果集组合起来,就可以生成一个输出。您可以使用UNION ALL:
SELECT
ename AS name,
sal
FROM
emp
UNION ALL
SELECT
dname,
NULL
FROM
dept
;您可以看到第二个子查询返回第二个列,其中填充了NULL。第二列是必需的,因为与UNION或UNION ALL组合的查询必须有相同数量的列(所有选择的对应列的类型必须兼容;NULL与任何类型都兼容)。
您还可以看到,ename列被重命名为name。这是因为第一个子查询中的列别名用于整个结果集,即第二个SELECT返回的列将采用第一个SELECT指定的名称。因此,由于第一列应该包含不同类型的名称,因此为其指定一个中性别名(因此是enames AS names )似乎更有意义。如果你愿意的话,你可以自由选择不同的别名。
注意,输出中的行可能是错误的。为了确保每个部门名称与相应的员工名称保持一致,您可以对deptno设置的结果进行排序。若要强制部门名称位于每个组中的员工名称之前,您可以通过empid对结果进行进一步排序。现在,在对UNION (ALL)查询进行排序时,必须只使用查询返回的列。因此,必须添加deptno和empid:
SELECT
ename AS name,
sal,
deptno,
empid
FROM
emp
UNION ALL
SELECT
dname,
NULL,
deptno,
NULL
FROM
dept
ORDER BY
deptno,
empid
;emp中的行具有deptno和empid。dept中的行只有deptno,empid将返回NULL。在Server中,NULL在任何其他值之前排序,因此您可以在第二个SELECT中看到另一个NULL,它对应于返回的empid
这将提供您所要求的内容,但结果集中还会有两个列,deptno和empid。如果确实希望只使用示例输出中显示的两列,则可以将上一次查询的结果用作派生表:
SELECT
name,
sal
FROM
(
SELECT
ename AS name,
sal,
deptno,
empid
FROM
emp
UNION ALL
SELECT
dname,
NULL,
deptno,
NULL
FROM
dept
) AS s
ORDER BY
deptno,
empid
;通过这种方式,您可以只为输出选择一些列(name和sal),也可以选择其他列用于排序(deptno和empid)。
https://stackoverflow.com/questions/25160026
复制相似问题