1

私はSQLにかなり慣れておらず、次のジレンマがあります。私は次の部分的な表を持っています:

アカウントの説明ShortDescription残高
------------------------------------------------
100001 Blah、blah Blah、blah 28350.68
100020 "" 2537.35
111000 "" 86898.12
111001 "" 63943.63
121000 "" 55325.68
121012 "" 65264.35
122000 "" 94898.85

最初の2桁から始まるすべてのアカウントの残高を合計する必要があります。したがって、最初の2つのバランスが合計され、次の2つが合計され、次の3つが合計されます。次に、これらの合計を取得して総計を作成する必要があります。

終了テーブルには、すべての列、SubTotal、およびGrandTotalが含まれます。これを行うための良い方法がわかりません。OVER-PARTITION BYを試しましたが成功しませんでした(SELECT SUM(Balance)OVER(PARTITION BY Account)AS SubTotal)。どんな助けでもいただければ幸いです。前もって感謝します。

4

2 に答える 2

2

これは、総計と小計を含むテーブルを出力する 1 つの方法です。

    -- select individual Rows
    select Account, Description, ShortDescription, Balance from Accounts
union
    -- subtotals
    select 
        substring(Account, 1, 2) as Account, 
        substring(Account, 1, 2) + ' Subtotal' as Description,
        '' as ShortDescription,
        sum(Balance) as Balance
    from Accounts
    group by substring(Account, 1, 2)
union
    -- grand total
    select 
        '' as Account,
        'Grand Total' as Description,
        '' as ShortDescription,
        sum(Balance) as Balance
    from Accounts
-- order all records to give the illusion of interlaced subtotals/grand total
order by Account desc

ただし、最適な解決策は、テーブルから単純に選択し、レポート ツール (SQL Server Reporting Services など) を使用して合計/小計を処理することだと思います。

Account上記のステートメントでは、列のタイプがchar/であると想定していることに注意してくださいvarchar。または他の数値型として宣言されている場合はint、適切なキャスト/変換変換を追加する必要があります。(a 内のすべてのデータ セットはunion、同じ数の列と同じデータ型を持つ必要があります)

于 2012-04-18T19:11:51.537 に答える
0

最初の問題は、構文が少し面倒なので、パーティションを正しく書き込むのが少し難しいことだったと思います。w0lf が提供したものの単純な代替手段として、探しているもの (個々の行のすべての値と合計) がわからない場合は、次の方法がより迅速な解決策となる可能性があります。

    Select *, SUM(Balance) OVER (PARTITION BY substring(Account, 1, 2)) as Subtotal, 
  Sum(Balance) over(Partition by 1) as Total
    from dbo.Accounts

これにより、分割の合計を使用して、小計列と合計列に加えて、元の各列 (*) が得られます。

次の構造とデータを使用しました。エラーが発生した場合は、これが役立つ場合があります。

   CREATE TABLE dbo.Accounts (Account varchar(10), [Description] varchar(10),
ShortDescription varchar(10), Balance money)  GO

    INSERT INTO Accounts (Account, Description, ShortDescription, Balance) VALUES  
    (100001, 'Blah', 'Blah2', 28350.68),(100020, 'Blah', 'Blah2', 2537.35),
    (111000, 'Blah', 'Blah2', 86898.12),(111001, 'Blah', 'Blah2', 63943.63),
    (121000, 'Blah', 'Blah2', 55325.68),(121012, 'Blah', 'Blah2', 65264.35),
    (122000, 'Blah', 'Blah2', 94898.85)

補足として、アカウントが数値として格納されている場合は、substring(Account, 1, 2) の代わりに substring(cast(Account as varchar(max)), 1, 2)) を使用できます。

于 2012-04-18T20:38:09.167 に答える