Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何组合第一个和第二个select语句_Sql_Sql Server_Select_Group By - Fatal编程技术网

Sql 如何组合第一个和第二个select语句

Sql 如何组合第一个和第二个select语句,sql,sql-server,select,group-by,Sql,Sql Server,Select,Group By,第一条select语句填充空值,第二条select语句删除重复项。如何从第一条SQL语句运行第二条SQL语句,或者是否有方法将它们组合起来 下面是SQL小提琴: 首先选择 /* Fill in null values with last record that is not null */ SELECT Id, FirstName, LastName, ISNULL(Address, ( SELECT TOP (1) Address FROM test WHERE (F

第一条select语句填充空值,第二条select语句删除重复项。如何从第一条SQL语句运行第二条SQL语句,或者是否有方法将它们组合起来

下面是SQL小提琴:

首先选择

/*
 Fill in null values with last record that is not null
*/
SELECT Id, FirstName, LastName, 

ISNULL(Address, 
(
SELECT TOP (1) Address    
 FROM test   
 WHERE (FirstName = MainTable.FirstName) AND (Address IS NOT NULL) AND (Address <> '')

ORDER BY Id DESC)

) AS Address

FROM test AS MainTable
 /*
Return a single record
*/
SELECT FirstName, LastName, MAX(Address) 
FROM test
Group By FirstName, LastName
预期结果:

| 4, john, doe, 9Street, SC | 
| 5, marry, doe, 78Street, DC | 

据我所知,您希望最新(按Id)地址和城市不为空,对吗?如果是:

SELECT max(t1.id) as id, t1.firstName, t1.lastName, adr.address, cty.City 
FROM test t1
cross apply (select top(1) address from test t2 
             where t1.FirstName = t2.FirstName and 
                   t1.LastName = t2.LastName and
                   t2.address is not null
             order by id desc) adr(Address)
cross apply (select top(1) city from test t2 
             where t1.FirstName = t2.FirstName and 
                   t1.LastName = t2.LastName and
                   t2.city is not null
             order by id desc) cty(City)
group by t1.firstName, t1.lastName, adr.address, cty.City;

如果您使用的是SQL Server 2012版或更高版本,则可以使用
last\u value()
获取有序行(此处为
id
)分区(此处为
firstname
lastname
)中的最后一个值

不幸的是,它不允许忽略
NULL
s。但是,如果我们将感兴趣的列
为NULL的行排序在不为NULL的行之前,我们就可以解决这个问题。如果列
为空,我们可以首先按
大小写进行排序,如果列
为空,则返回一个较低的值;如果列
为空,则返回一个较高的值。第二列是
orderby
id

如果每个
firstname
lastname
只获取一行,那么简单的
DISTINCT
就可以了,因为
地址和
城市和
在共享
firstname
lastname
的任何行中都是相同的

SELECT DISTINCT
       t1.firstname,
       t1.lastname,
       last_value(t1.address) OVER (PARTITION BY t1.firstname,
                                                 t1.lastname
                                    ORDER BY CASE
                                            WHEN t1.address IS NULL THEN
                                              -1
                                            ELSE
                                              1
                                            END,
                                            t1.id
                                    RANGE BETWEEN UNBOUNDED PRECEDING
                                          AND UNBOUNDED FOLLOWING) address,
       last_value(t1.city) OVER (PARTITION BY t1.firstname,
                                              t1.lastname
                                 ORDER BY CASE
                                            WHEN t1.city IS NULL THEN
                                              -1
                                            ELSE
                                              1
                                          END,
                                          t1.id
                                 RANGE BETWEEN UNBOUNDED PRECEDING
                                               AND UNBOUNDED FOLLOWING) city
       FROM test t1;

如果您使用的是
SQLServer2012
或更高版本,
sticky bit
answer看起来是最好的答案。如果您使用的是较低版本,则可以检查以下答案

SELECT 
CAST((CASE
  WHEN CHARINDEX('$', Id) > 0
  THEN RIGHT(Id, CHARINDEX('$', REVERSE(Id)) - 1)
  ELSE Id
  END
) AS INT) AS Id,
Firstname, Lastname,
(CASE
  WHEN CHARINDEX('$', Address) > 0
  THEN RIGHT(Address, CHARINDEX('$', REVERSE(Address)) - 1)
  ELSE Address
  END
) AS Address,
(CASE
  WHEN CHARINDEX('$', City) > 0
  THEN RIGHT(City, CHARINDEX('$', REVERSE(City)) - 1)
  ELSE City
  END
) AS City
FROM (

SELECT A.Firstname, A.Lastname, 
STUFF((
  SELECT '$' + CAST(B.Id AS VARCHAR)
  FROM test B 
  WHERE B.Firstname = A.Firstname
  AND
  B.Lastname = A.Lastname
  For XML Path('')),1,1,'') AS Id,
STUFF((
  SELECT '$' + B.Address
  FROM test B 
  WHERE B.Firstname = A.Firstname
  AND
  B.Lastname = A.Lastname
  For XML Path('')),1,1,'') AS Address,
STUFF((
  SELECT '$' + B.City
  FROM test B 
  WHERE B.Firstname = A.Firstname
  AND
  B.Lastname = A.Lastname
  For XML Path('')),1,1,'') AS City
FROM test A  
GROUP BY A.Firstname, A.Lastname
) T

我认为标题是错误的,应该是“如何获取不同列的最新值”

还希望您的表应该包含
EmpID
USERID
,以便可以在其上创建索引

或者,如果可能,表格可以进一步标准化

Create table Table1(Empid int pk,FirstName,LastName)

Create table Table2(id int identity(1,1),EMPID FK,Adress,city)
查询这两个表将非常有效

SELECT DISTINCT t.Firstname
    ,t.Lastname
    ,t1.Address
    ,t2.City
FROM #test t
CROSS APPLY (
    SELECT TOP 1 t1.Address
    FROM #test t1
    WHERE t1.Address IS NOT NULL
        AND t.Firstname = t1.Firstname
        AND t.Lastname = t1.Lastname
    ORDER BY t1.id DESC
    ) t1
CROSS APPLY (
    SELECT TOP 1 t2.City
    FROM #test t2
    WHERE t2.City IS NOT NULL
        AND t.Firstname = t2.Firstname
        AND t.Lastname = t2.Lastname
    ORDER BY t2.id DESC
    ) t2

你期望的结果是什么?| 4,john,doe,9Street,SC | | 5,Mary,doe,78Street,DC |基本上这两个select语句填充空值,然后删除重复项。