2013-04-24 5 views
1

Я использую SQLServer2008.Объединить запись по идентификатору

Выход Мой хранимая процедура:

-------------------------------------------------------- 
BrokerCode | MemberId | FY | SY | TY | 
-------------------------------------------------------- 
    104  | 24  | 1140 | 0.00 | 0.00 | 
-------------------------------------------------------- 
    104  | 24  | 1140 | 570 | 0.00 | 
-------------------------------------------------------- 
    104  | 30  | 500 | 0.00 | 0.00 | 
-------------------------------------------------------- 
    104  | 30  | 500 | 360 | 0.00 | 
-------------------------------------------------------- 

И я хочу привести как:

-------------------------------------------------------- 
BrokerCode | MemberId | FY | SY | TY | 
-------------------------------------------------------- 
    104  | 24  | 1140 | 570 | 0.00 | 
-------------------------------------------------------- 
    104  | 30  | 500 | 360 | 0.00 | 
-------------------------------------------------------- 

Так я попытался с помощью:

WITH CTE AS ( 
SELECT BrockerCode, 
    MemberId, 

    RN=ROW_NUMBER()OVER(PARTITION BY MemberId ORDER BY MemberID), 
    FY=MIN(FY)OVER(PARTITION BY MemberId), 
    SY=MIN(SY)OVER(PARTITION BY MemberId), 
    TY=MIN(TY)OVER(PARTITION BY MemberId) 

    FROM @tablePromotee) 
SELECT MemberId,BrockerCode,FY,SY,TY FROM CTE WHERE RN = 1 

, но все-таки показывать неправильно результат ... пожалуйста, помогите мне .. где я неправ? Благодарю.

+0

не должно быть 'FY = MAX (FY) OVER (PARTITION by MemberId)' вместо 'MIN'? – praveen

ответ

0

Попробуйте один -

SELECT 
     MemberId 
    , BrockerCode 
    , FY = MAX(FY) 
    , SY = MAX(SY) 
    , TY = MAX(TY) 
FROM (
    SELECT 
      BrockerCode 
     , MemberId 
     , RN = ROW_NUMBER()OVER(PARTITION BY MemberId ORDER BY MemberID) 
     , FY = MIN(FY)OVER(PARTITION BY MemberId) 
     , SY = MIN(SY)OVER(PARTITION BY MemberId) 
     , TY = MIN(TY)OVER(PARTITION BY MemberId) 
    FROM @tablePromotee 
) 
WHERE RN = 1 
GROUP BY 
     BrokerCode 
    , MemberId 

Или попробуйте это -

SELECT TOP 1 
     BrockerCode 
    , MemberId 
    , FY = MAX(MIN(FY)OVER(PARTITION BY MemberId)) 
    , SY = MAX(MIN(SY)OVER(PARTITION BY MemberId)) 
    , TY = MAX(MIN(TY)OVER(PARTITION BY MemberId)) 
FROM @tablePromotee 
GROUP BY 
     BrokerCode 
    , MemberId 
ORDER BY MemberId 
0

Попробуйте это,

SELECT BrockerCode, 
      MemberId, FY,SUM(SY),SUM(TY) FROM @tablePromotee Group By BrockerCode, 
      MemberId, FY 
+0

Я не хочу делать сумму – Prashant16

+0

, затем перейдите к другим ответам. – Maximus

1

Вы можете просто использовать "GROUP BY" в запросе Like,

SELECT BrockerCode, 
    MemberId, 
    MIN(FY) 
    MIN(SY) 
    MIN(TY) 
    FROM @tablePromotee GROUP BY BrockerCode, MemberId 

На сервере sql можно использовать несколько агрегатных функций, которые вы можете использовать в соответствии с вашими требованиями.

1

Common Table Expression здесь не требуется. Намного проще запрос:

SELECT 
     BrokerCode, 
     MemberId, 
     MAX(FY) AS FY, 
     MAX(SY) AS SY, 
     MAX(TY) AS TY 
FROM YourTable 
GROUP BY BrokerCode, MemberId 

SQL FIDDLE DEMO

0

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

SELECT MemberId,BrockerCode,FY,SY,TY FROM CTE WHERE RN = 1 and SY<>0 
ROUP BY BrockerCode, MemberId