首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我希望通过使用sql server中的任何程序或查询来获得以下输出

我希望通过使用sql server中的任何程序或查询来获得以下输出
EN

Stack Overflow用户
提问于 2014-08-06 12:08:53
回答 2查看 435关注 0票数 0

我有两个表,我想要的结果,我已经提到以下。我使用的sql server 2012表如下:

emp

代码语言:javascript
复制
╔═══════╦═════════╦═════╦════════╗
║ empid ║  ename  ║ sal ║ deptno ║
╠═══════╬═════════╬═════╬════════╣
║     1 ║ vikrant ║   5 ║      1 ║
║     2 ║ Nimesh  ║   2 ║      1 ║
║     3 ║ memo    ║   6 ║      2 ║
║     4 ║ sabir   ║   5 ║      2 ║
╚═══════╩═════════╩═════╩════════╝

部门

代码语言:javascript
复制
╔════════╦══════════════╗
║ deptno ║    dname     ║
╠════════╬══════════════╣
║      1 ║ Tech         ║
║      2 ║ Creative     ║
╚════════╩══════════════╝ 

成果/产出:共计6行

代码语言:javascript
复制
╔══════════╦═══╗
║ Tech     ║   ║
║ Vikrant  ║ 5 ║
║ Nimesh   ║ 2 ║
║ Creative ║   ║
║ Memo     ║ 6 ║
║ Sabir    ║ 5 ║
╚══════════╩═══╝  

我希望在第一行技术中是部门名称,然后在该dpt中的第2行emp名称中,他/她的工资(即他/她的dpt名称)应该打印一次,然后再打印该dpt中所有emp的emp名称,abv只是一个例子。

EN

回答 2

Stack Overflow用户

发布于 2014-08-06 14:42:46

下一次,请通过发布到SQL的链接来帮助自己。

下面是另一个您可以使用的查询。分组集与UNION差不多,但更简洁。

代码语言:javascript
复制
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

为了清晰起见,我向结果集添加了dnameename列。在您的代码中删除它们。需要CONVERT(varchar(10),...),因为Salary列必须只有一个数据类型。如果选择int/float,部门级别的行将显示为0。所以我把它转换成varchar

票数 0
EN

Stack Overflow用户

发布于 2014-08-08 08:42:30

您可以从两个单独的查询开始,一个返回员工及其薪资:

代码语言:javascript
复制
SELECT
  ename,
  sal
FROM
  emp
;

其他部门:

代码语言:javascript
复制
SELECT
  dname
FROM
  dept
;

现在,您只需要将两个结果集组合起来,就可以生成一个输出。您可以使用UNION ALL:

代码语言:javascript
复制
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)查询进行排序时,必须只使用查询返回的列。因此,必须添加deptnoempid

代码语言:javascript
复制
SELECT
  ename AS name,
  sal,
  deptno,
  empid
FROM
  emp

UNION ALL

SELECT
  dname,
  NULL,
  deptno,
  NULL
FROM
  dept

ORDER BY
  deptno,
  empid
;

emp中的行具有deptnoempiddept中的行只有deptnoempid将返回NULL。在Server中,NULL在任何其他值之前排序,因此您可以在第二个SELECT中看到另一个NULL,它对应于返回的empid

这将提供您所要求的内容,但结果集中还会有两个列,deptnoempid。如果确实希望只使用示例输出中显示的两列,则可以将上一次查询的结果用作派生表:

代码语言:javascript
复制
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
;

通过这种方式,您可以只为输出选择一些列(namesal),也可以选择其他列用于排序(deptnoempid)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25160026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档