我遇到一个问题,我的查询需要从TransactionDateTime
中选择ActivityId = 6
,而不是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行而不是从ActivityId 66行输出TransactionDateTime。其他所有内容都需要来自ActivityId 66行。 6和66行都具有相同的卡ID和相同的TransactionId。
我相信可以这样实现:插入不同的CardID,通过CardID和TransactionId将它们分组到临时表中,然后使用它来提取第6行。但是我想知道是否可以通过将聚合函数与group by一起使用来在单个查询操作中完成此操作。
任何帮助都会很棒!
谢谢
答案 0 :(得分:0)
我建议您使用子查询来解决此问题
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
尝试举一些例子,有时候很难猜出你想要什么,我希望这对你有用。
答案 1 :(得分:0)
您需要使用汇总和分组依据:
您可以使用min activityID,因为它具有相同的CC.historyid,
CC。[CreditCardId]和
对于transactiondate,您需要使用maximum,以便为您提供活动ID 66的日期
SELECT
CC.historyid,
CC.[CreditCardId],
min(CC.[ActivityId]) as activityid,
max(CC.[TransactionDateTime]) as TransactionDateTime,
FROM
dbo.[CreditCard] CC WITH(NOLOCK)
WHERE
CC.[historyId] = '393506845'
AND CC.[VANTransactionDateTime] >= @ReportStartDate
AND CC.[VANTransactionDateTime] < @ReportEndDate
GROUP BY
CC.historyid, CC.[CreditCardId]
答案 2 :(得分:-1)
我没有任何数据可用于测试,但是您可以尝试使用
{{1}}
答案 3 :(得分:-1)
在条件中使用嵌套选择之前,您可以使用嵌套选择并对其进行简单转换
选择...从 ( 选择 ..., LEN([ActivityId])= 1时的情况然后以CONCAT('0',[ActivityId])ELSE CAST([ActivityId] AS VARCHAR())END AS ActivityId from dbo.CreditCard)作为CC WHERE CC.ActivityId = '06';