SQL Server: ВЫБЕРИТЕ конкретную строку из результирующего набора GROUPED BY - PullRequest
0 голосов
/ 01 октября 2018

У меня проблема, когда в моем запросе нужно выбрать 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

Однако мне нужно изменить запрос для вывода TransactionDateTime из строки ActivityId 6 вместо TransactionDateTime из ActivityId 66. Все остальное должно исходить изActivityId 66 строки.Обе из 6 и 66 строк имеют одинаковый идентификатор карты и один и тот же TransactionId.

Я полагаю, что этого можно достичь, вставив отдельные идентификаторы CardID, сгруппировав их по CardID и TransactionId во временную таблицу, а затем используя ее для извлечения6 ряд.Но мне интересно, можно ли выполнить эту операцию в одной операции запроса, возможно, с помощью агрегатных функций с группой с помощью.

Любая помощь будет великолепной!

Спасибо

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Вам нужно использовать агрегацию и группировку для вашего результата:

Вы можете использовать минимальный идентификатор активности, так как он имеет тот же CC.historyid,
CC. [CreditCardId], а для даты транзакции вам нужно использовать максимумтак что он даст вам дату активности идентификатор 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]
0 голосов
/ 01 октября 2018

Вы можете использовать вложенный выбор и выполнить простое преобразование в столбце, прежде чем использовать его в критериях

SELECT ... FROM (SELECT ..., CASE WHEN LEN ([ActivityId]) = 1THEN CONCAT ('0', [ActivityId]) ELSE CAST ([ActivityId] AS VARCHAR ()) END AS ActivityId FROM dbo.CreditCard) как CC, ГДЕ CC.ActivityId = '06 ';

0 голосов
/ 01 октября 2018

Я рекомендую вам использовать подзапрос для решения этой проблемы

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

Попробуйте привести несколько примеров, иногда трудно угадать, что вы хотите, я надеюсь, что это работает для вас.

0 голосов
/ 01 октября 2018

У меня нет ваших данных для проверки, но вы можете попробовать что-то вроде

SELECT CC.[CreditCardId],
CC.[ActivityId],
LJ.[TransactionDateTime],
FROM dbo.[CreditCard] CC WITH(NOLOCK)

Left Join (Select * From dbo.[CreditCard] Where [ActivityID] = 6 ) As LJ WITH(NOLOCK)
On  CC.[CreditCardId]  = LJ.[CreditCardId]
And CC.[HistoryId]    = LJ.[HistoryId]

WHERE CC.[ActivityId] = 66
AND CC.[VANTransactionDateTime] >= @ReportStartDate
AND CC.[VANTransactionDateTime] < @ReportEndDate
...