SQL允许字段有一个返回值
在我的办公室里,是属于两个部门的普通人。对于查询,我想限制它,使每个人只与一个部门关联 例如,这里有两个HR表: 表1SQL允许字段有一个返回值,sql,Sql,在我的办公室里,是属于两个部门的普通人。对于查询,我想限制它,使每个人只与一个部门关联 例如,这里有两个HR表: 表1 ID | Last_Name | Department -------------------------------- 1 Doe Informatics 2 Miller Database Management 2 Miller Informatics 3 Johnson
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,在那里我做了一个计算,基本上计算出每个人出现“销售日期”的次数。