Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
如何使用GROUPBY返回T-SQL中同一行的多个列_Sql_Sql Server_Tsql - Fatal编程技术网

如何使用GROUPBY返回T-SQL中同一行的多个列

如何使用GROUPBY返回T-SQL中同一行的多个列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含以下列的事务表: MemberID, 事务ID, 日期, 付款方式, +更多的专栏 主键由MemberID和TransactionID组成。我需要一个查询,该查询按MemberID将这些行分组为最新日期。这很简单,但另外我需要最新日期的其他列,例如付款方式。我正在寻找最简单的方法来实现这一点 我知道这是一种方法,但是如果我必须为我拥有的每一列包含一个子查询,那么查询会变得非常长。我的直觉告诉我必须有更好的方法 SELECT MemberID, MAX(Date) AS D

我有一个包含以下列的事务表: MemberID, 事务ID, 日期, 付款方式, +更多的专栏

主键由MemberID和TransactionID组成。我需要一个查询,该查询按MemberID将这些行分组为最新日期。这很简单,但另外我需要最新日期的其他列,例如付款方式。我正在寻找最简单的方法来实现这一点

我知道这是一种方法,但是如果我必须为我拥有的每一列包含一个子查询,那么查询会变得非常长。我的直觉告诉我必须有更好的方法

SELECT
   MemberID,
   MAX(Date) AS Date,
   (
      SELECT TOP(1) MethodOfPayment
      FROM Transactions
      WHERE MemberID = t.MemberID
      ORDER BY Date DESC
   ) AS MethodOfPayment
FROM Transactions t
GROUP BY MemberID
单程

SELECT t1.* 
FROM(
SELECT
   MemberID,
   MAX(Date) AS MaxDate
   FROM Transactions 
GROUP BY MemberID) t2 
JOIN Transactions t1 ON t2.MaxDate = t1.Date
AND t2.MemberID = t1.MemberID
如果您使用的是SQL Server 2005或更高版本,则使用另一种方法

;WITH  cte AS(SELECT *,
 ROW_NUMBER() OVER(PARTITION BY MemberID ORDER BY date DESC) AS ROW
 FROM Transactions)

SELECT * FROM cte
where row = 1

您使用的是哪个版本的SQL Server?我不太了解通用表表达式的第二种方式,因为它甚至没有表名。这是因为我忘记添加它,我现在添加了它