SQL允许字段有一个返回值

SQL允许字段有一个返回值,sql,Sql,在我的办公室里,是属于两个部门的普通人。对于查询,我想限制它,使每个人只与一个部门关联 例如,这里有两个HR表: 表1 ID | Last_Name | Department -------------------------------- 1 Doe Informatics 2 Miller Database Management 2 Miller Informatics 3 Johnson

在我的办公室里,是属于两个部门的普通人。对于查询,我想限制它,使每个人只与一个部门关联

例如,这里有两个HR表:

表1

ID   |  Last_Name | Department
--------------------------------
 1        Doe        Informatics
 2        Miller     Database Management
 2        Miller     Informatics
 3        Johnson    Engineering
 4        Mitchell   Database Management
 4        Mitchell   Engineering
表2

ID   |  Date_of_sale
--------------------------------
 1        8-2-2012        
 1        1-4-2003     
 2        5-23-2000     
 2        1-17-2003
 2        12-30-2001
 2        9-8-2013
 3        4-19-2013
 4        3-8-2015
 4        11-8-2013
 4        2-12-2007
我想做一些类似的事情:

SELECT Last_Name, FIRST(Department), Date_of_Sale 
From column1, 
FROM column1 JOIN column2 ON column1.id=column2.id
GROUP BY Last_Name 
这将返回:

          Last_Name | Department |     Date_of_sale 
       ----------------------------------------
        Doe         Informatics            8-2-2012
        Doe         Informatics            1-4-2003
        Miller      Database Management    5-23-2000
        Miller      Database Management    1-17-2003
        Miller      Database Management    12-30-2001
        Miller      Database Management    9-8-2013    
        Johnson     Engineering            4-19-2013
        Mitchell    Database Management    3-8-2015
        Mitchell    Database Management    11-8-2013
        Mitchell    Database Management    2-12-2007

每个人现在只有一个与他们相关的部门。

不知道您的RDBMS给出具体的答案并不容易。在大多数系统上,一个普遍的答案是使用带聚合的嵌套select:

SELECT c1.ID, c1.Last_name, c1.Department, c2.Date_of_Sale
FROM
    (SELECT
       ID
       ,Last_name
       ,MIN(Department) as Department
    FROM
       column1
    GROUP BY
       ID
       ,Last_name) c1
    INNER JOIN column2 c2
    ON c1.ID = c2.ID
然后,在SQL-SERVER和大多数其他支持公共表表达式和窗口函数的RDBMS上,您可以创建一个分区行_NUMBER(),以选择所需内容(注意,cte也可以是嵌套的select)

;WITH cte AS (
    SELECT
       *
       ,ROW_NUMBER() OVER (PARTITION BY  ID ORDER BY Department) as RowNumber
    FROM
       column1
)

SELECT
    c1.Id
    ,c1.Last_name
    ,c1.Department
    ,c2.Date_of_Sale
FROM
    cte c1
    INNER JOIN column2 c2
    ON c1.Id = c2.Id
WHERE
    c1.RowNumber = 1
这是一种典型的方法,如果您将在返回的部门(例如记录创建日期)上放置一个presentence,但是如果支持窗口函数,并且您并不真正关心哪个部门,那么您可以获取分区的MIN()或MAX(),这只是1 select语句中记录的升序

SELECT DISTINCT
    c1.ID
    ,c1.Last_name
    ,MIN(c1.Department) OVER (PARTITION BY c1.ID) as Department
    ,c2.Date_of_Sale
FROM
    column1 c1
    INNER JOIN column2 c2
    ON c1.ID = c2.ID

不知道您的RDBMS会给出具体的答案并不是那么容易。在大多数系统上,一个通用的答案是使用带聚合的嵌套select:

SELECT c1.ID, c1.Last_name, c1.Department, c2.Date_of_Sale
FROM
    (SELECT
       ID
       ,Last_name
       ,MIN(Department) as Department
    FROM
       column1
    GROUP BY
       ID
       ,Last_name) c1
    INNER JOIN column2 c2
    ON c1.ID = c2.ID
然后,在SQL-SERVER和大多数其他支持公共表表达式和窗口函数的RDBMS上,您可以创建一个分区行_NUMBER(),以选择所需内容(注意,cte也可以是嵌套的select)

;WITH cte AS (
    SELECT
       *
       ,ROW_NUMBER() OVER (PARTITION BY  ID ORDER BY Department) as RowNumber
    FROM
       column1
)

SELECT
    c1.Id
    ,c1.Last_name
    ,c1.Department
    ,c2.Date_of_Sale
FROM
    cte c1
    INNER JOIN column2 c2
    ON c1.Id = c2.Id
WHERE
    c1.RowNumber = 1
这是一种典型的方法,如果您将在返回的部门(例如记录创建日期)上放置一个presentence,但是如果支持窗口函数,并且您并不真正关心哪个部门,那么您可以获取分区的MIN()或MAX(),这只是1 select语句中记录的升序

SELECT DISTINCT
    c1.ID
    ,c1.Last_name
    ,MIN(c1.Department) OVER (PARTITION BY c1.ID) as Department
    ,c2.Date_of_Sale
FROM
    column1 c1
    INNER JOIN column2 c2
    ON c1.ID = c2.ID

根据您使用的SQL类型以及您希望为每个姓氏选择部门的方式,有几种方法可以做到这一点

这里有几个使用MySQL的例子

  • 选择首先列出的部门:

    SELECT id, last_name, 
    SUBSTRING_INDEX(GROUP_CONCAT(department), ',', 1) AS Department
    FROM column1
    GROUP BY id, last_name
    
  • 按字母顺序选择部门:

    SELECT id, last_name, MIN(department)
    FROM column1
    GROUP BY id, last_name
    

  • 此处测试:

    根据您使用的SQL类型以及您希望为每个姓氏选择部门的方式,有几种方法可以做到这一点

    这里有几个使用MySQL的例子

  • 选择首先列出的部门:

    SELECT id, last_name, 
    SUBSTRING_INDEX(GROUP_CONCAT(department), ',', 1) AS Department
    FROM column1
    GROUP BY id, last_name
    
  • 按字母顺序选择部门:

    SELECT id, last_name, MIN(department)
    FROM column1
    GROUP BY id, last_name
    

  • 此处测试:

    使用子查询获取每个用户的第一个部门,然后连接到第二个表:

    SELECT  t1.Last_Name, 
            t1.Department, 
            t2.Date_of_Sale 
        FROM (select id, Last_Name, MIN(Department) Department from column1 group by id, Last_Name) t1
        JOIN column2 t2 ON 
            t1.id = t2 .id
    

    使用子查询获取每个用户的第一个部门,然后连接到第二个表:

    SELECT  t1.Last_Name, 
            t1.Department, 
            t2.Date_of_Sale 
        FROM (select id, Last_Name, MIN(Department) Department from column1 group by id, Last_Name) t1
        JOIN column2 t2 ON 
            t1.id = t2 .id
    

    您使用的是
    MySQL
    还是
    SQL Server
    ?它们不是一回事。在不知道您的RDBMS的情况下,不确定哪一个副本适用。请找到您的副本并将其标记为:那么你明白了吗?问题是什么?你想要的结果是什么?第2栏与这个问题有什么关系?使用一个同时使用MYSQL和SQL Server RDBMS的数据仓库。最后,SQL Server起了作用。很抱歉,由于一个紧急电话,不得不提前离开……最后,我不相信日期的数据类型_“销售日期”列是相关的。我正在将这些数据传递给Tableau,在那里我正在进行计算,基本上计算“销售日期”的次数人均出现。您使用的是
    MySQL
    还是
    SQL Server
    ?它们不是一回事。在不知道您的RDBMS的情况下,不确定哪一个副本适用。请找到您的副本并标记它。:)那么您找到了吗?问题是什么?你期望的输出是什么?第2栏与这个问题有什么关系?使用同时使用MYSQL和SQL Server RDBMS的数据仓库。最后,SQL Server起了作用。抱歉,由于一个紧急电话,不得不提前离开。。。最后,我认为销售日期列的数据类型不相关。我将这些数据传递给Tableau,在那里我做了一个计算,基本上计算出每个人出现“销售日期”的次数。