Linke äußere Verknüpfung für erste Zeile in der Gruppe nur

Ich habe einen Tisch, der so aussieht:

BANK ACCOUNT_NAME EXCESS DEBT Acme Bank Checking1 500 300 Acme Bank Personal 200 100 Bank One Business 100 50 

Ich brauche eine SQL-Abfrage, die zurückgibt.

 BANK ACCOUNT_NAME EXCESS DEBT AVAILABLE Acme Bank Checking1 500 300 300 Acme Bank Personal 200 100 NULL Bank One Business 100 50 50 

VERFÜGBAR wäre die Sum(EXCESS) - Sum(DEBT) gruppiert nach BANK . VERFÜGBAR würde dann nur auf der ersten Reihe der BANK-ACCOUNT_NAME-Kombination erscheinen. Wie mache ich das?

Mein erster Versuch führt zu VERFÜGBAR mit Werten auf allen Zeilen , die nicht beabsichtigt sind. Ich möchte nur die erste Zeile in der Gruppe einen AVAILABLE Wert haben.

 SELECT outer.BANK ,outer.ACCOUNT_NAME ,outer.EXCESS ,outer.DEBT ,inner2.AVAILABLE FROM BankBalances AS outer CROSS APPLY ( SELECT TOP 1 Bank ,SUM(EXCESS) - SUM(DEBT) AS AVAILABLE FROM BankBalances AS inner GROUP BY Bank WHERE outer.BANK = inner.BANK ) AS inner2 

Sie können die folgende Abfrage verwenden:

 SELECT BANK, ACCOUNT_NAME, EXCESS, DEBT, CASE WHEN ROW_NUMBER() OVER (PARTITION BY BANK ORDER BY ACCOUNT_NAME) = 1 THEN SUM(EXCESS) OVER (PARTITION BY BANK) - SUM(DEBT) OVER (PARTITION BY BANK) ELSE NULL END AS AVAILABLE FROM BankBalances 

Sie können die windowsversion von SUM verwenden, um CROSS APPLY zu vermeiden. ROW_NUMBER wird einfach verwendet, um nach der ersten Zeile zu ROW_NUMBER .

Ich habe die Annahme gemacht, dass die erste Zeile als die mit dem 'Minimum' ACCOUNT_NAME Wert innerhalb jeder BANK Partition betrachtet wird.

Demo hier

Du kannst ROW_NUMBER und SUM OVER() mit Partition so verwenden.

 ;WITH CTE AS ( SELECT BANK ,ACCOUNT_NAME ,EXCESS ,DEBT ,SUM(EXCESS - DEBT) OVER(PARTITION BY BANK) AS AVAILABLE, ,ROW_NUMBER()OVER(PARTITION BY BANK ORDER BY ACCOUNT_NAME ASC) rn FROM BankBalances ) SELECT BANK ,ACCOUNT_NAME ,EXCESS ,DEBT ,CASE WHEN rn = 1 THEN AVAILABLE ELSE null end as AVAILABLE FROM CTE