4

開発しようとしているクエリに小さな課題があります。

これが私のテーブルの様子です:-

勘定科目表

ClientNo        AccountType          Balance
  1234             SUP1                25
  1234            SUP1.1               35
  1234             RET1                20
  1111             SUP1                50
  1111             DIS4                60

次のような結果を得ようとしています:-

ClientNo   TotSupBal   TotSuppAccts   TotRetBal  TotRetAccts  TotDisBal   TotDisAccts
 1234         70             2           20          1            0             0
 1111         50             1            0          0            60            1

基本的に、クライアントごとに多数のアカウントが存在する可能性があるため、クライアントはアカウントテーブルに何度も存在する可能性があります。

アカウントの種類は常に同じ文字で始まりますが、これらのアカウントの数に応じて、実際の数は何でもかまいません。後続のアカウントは常に10進数で、次に数字になります...たとえば、最初のSUPアカウントは単純にSUP1です。ただし、次のSUPアカウントはSUP1.1、次にSUP1.2などになります。

私は次のクエリを書きました

SELECT ClientNo, SUM(Balance) AS TotSupBal, COUNT(AccountType) AS TotSuppAccts
FROM Account
WHERE (AccountType LIKE 'SUP1.%') OR (AccountType = 'SUP1')
GROUP BY ClientNo

* WHERE句が2つある理由は、SUP1と同じではないSUP12のようなアカウントがあるため、SUP1%だけを使用できないためです。

このクエリは正常に機能しますが、アカウントタイプがSUPのリストのみを生成します。アカウントタイプごとに複数の列にわたって同じ種類の出力を生成するにはどうすればよいですか?

Microsoft SQL2008R2を使用しています

4

3 に答える 3

3

PIVOT が必要です >> http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

完全に機能するソリューションは次のとおりです。

WITH Accounts (AccountCategory, ClientNo, Balance) as (
  select 
    case 
        when AccountType like 'SUP%' then 'sup'
        when AccountType like 'RET%' then 'ret'
        when AccountType like 'DIS%' then 'dis' 
    end as AccountCategory,
    ClientNo, 
    Balance
  from Account
)
select * from (
  select ClientNo, sup as TotSupBal, ret as TotRetBal, dis as TotDisBal from Accounts as SourceTable PIVOT (
    SUM(Balance)
    FOR AccountCategory IN ([sup], [ret], [dis])
  ) as pt
) as sums inner join (
  select ClientNo, sup as TotSupAccts, ret as TotRetAccts, dis as TotDisAccts from Accounts as SourceTable PIVOT (
   COUNT(Balance)
   FOR AccountCategory IN ([sup], [ret], [dis])
  ) as pt
) as counts on sums.ClientNo = counts.ClientNo

SqlFiddle で試してみてください: http://sqlfiddle.com/#!6/d5e91/26

于 2012-12-28T04:24:34.627 に答える
0

アカウントの種類を事前に知っていると仮定します。この場合、条件付き集計の合計が必要です。

select clientNo,
       sum(case when (AccountType LIKE 'SUP1.%') OR (AccountType = 'SUP1')
                then Balance
            end) as TotSupBal,
       sum(case when (AccountType LIKE 'SUP1.%') OR (AccountType = 'SUP1')
                then 1
                else 0
           end) as TotSupAccts,
       sum(case when left(AccountType, 3) = 'RET'
                then Balance
            end) as TotRetBal,
       sum(case when left(AccountType, 3) = 'RET'
                then 1
                else 0
           end) as TotRetAccts,
       . . .
from account
group by clientNo

他のアカウントの正確なロジックがわからないので、最初の3文字だけを見ています。

于 2012-12-28T03:47:00.590 に答える
0
SELECT
    ClientNo, 
    SUM(Balance) AS TotSupBal,
    COUNT(AccountType) AS TotSuppAccts,
    ret_bal AS TotRetBal,
    total_ret AS TotRetAccts
FROM 
    Account,
    (
        SELECT
            ClientNo c_num,
            SUM(Balance) AS ret_bal,
            COUNT(AccountType) total_ret
        WHERE AccountType LIKE 'RET%'
        GROUP BY ClientNo
    ) Table1RET_type  -- Your name for new table(You create new temporary table for you select) 
WHERE
    ((AccountType LIKE 'SUP1.%') OR (AccountType = 'SUP1'))
    AND Table1RET_type.c_num = ClientNo -- This is called join Table(google it for more info)
GROUP BY ClientNo

ここで、作成するすべての列に対してこのロジックを繰り返す必要があります。

于 2012-12-28T03:48:49.773 に答える