首页 > 解决方案 > SQL Server:从 GROUPED BY 结果集中选择特定行

问题描述

我有一个问题,我的查询需要选择TransactionDateTimefromActivityId = 6而不是 date 值 from ActivityId 66

数据集如下所示:

HistoryId | CardId | ActivityId | TransactionId | TransactionDateTime
----------+--------+------------+---------------+----------------------------------
393338052   58329067    12  937DB39B-711B-E611-80D3-0025B5560BDC  2016-06-01 01:43:28.307   
393342190   58329067    13  NULL    2016-06-01 01:50:02.243  2016-06-01 01:50:02.243
393506845   58329067     6  00000000-0000-0000-0000-000000000000  2016-06-01 08:51:44.640   
393506845   58329067    66  00000000-0000-0000-0000-000000000000  2016-06-03 09:01:20.017   
385651974   58329067     5  937DB39B-711B-E611-80D3-0025B5560BDC  2016-05-16 14:23:14.560   
385596117   58329067    16  NULL    2016-05-16 13:10:16.600  2016-05-16 13:10:16.600

我目前的查询如下所示:

SELECT 
    CC.[CreditCardId],
    CC.[ActivityId],
    CC.[TransactionDateTime],
FROM 
    dbo.[CreditCard] CC WITH(NOLOCK)
WHERE 
    CC.[ActivityId] = 66
    AND CC.[VANTransactionDateTime] >= @ReportStartDate
    AND CC.[VANTransactionDateTime] < @ReportEndDate

但是,我需要修改查询以从 ActivityId 6 行输出 TransactionDateTime,而不是从 ActivityId 66 输出 TransactionDateTime。其他一切都需要来自 ActivityId 66 行。6 行和 66 行都具有相同的 Card Id 和相同的 TransactionId。

我相信这可以通过插入不同的 CardID 来实现,按 CardID 和 TransactionId 将它们分组到一个临时表中,然后使用它来提取 6 行。但我想知道这个操作是否可以在单个查询操作中完成,也许是通过使用 group by 的聚合函数。

任何帮助都会很棒!

谢谢

标签: sqlsql-serverselectgroup-bysubquery

解决方案


我建议你使用子查询来处理这个问题

SELECT 
    CC.[CreditCardId],
    CC.[ActivityId],
    (SELECT TransactionDateTime 
     FROM dbo.[CreditCard] AS cs 
     WHERE Cs.[ActivityId] = 6 and cs.CardId = cc.CardId) AS [TransactionDateTime]
FROM 
    dbo.[CreditCard] CC WITH(NOLOCK)
WHERE 
    CC.[ActivityId] = 66
    AND CC.[VANTransactionDateTime] >= @ReportStartDate
    AND CC.[VANTransactionDateTime] < @ReportEndDate

试着举一些例子,有时很难猜出你想要什么,我希望这对你有用。


推荐阅读