2016-12-31 5 views
0

私は、貨幣転送トランザクションを含むSQLデータベーステーブルを持っています。私は4列があります。TransferID、支払人、受取人、金額一部のトランザクションの合計を表示するSQLクロス集計クエリ

だが、これは私のデータベーステーブルであるとしましょう:

DatabaseTable

私はそれぞれの人によって送信されたどのくらいのお金を参照してクロス集計クエリを作成することができます彼のお互いの友達。結果は次のようなもののようになります。

ResultOfCrosstabQuery

しかし、私が見たいものを各2人の男との間の取引のバランスです。例えば、ピーターがジョンに13ドルを、ジョンがピーターに2ドルを送った場合、私は13ドルと2ドルではなく、取引の集計結果として11ドル($ 11)を見たいと思う。結果は次のようになります。
ResultTable

どのようなクエリがトリックを作れますか?

+0

質問を編集してクロス集計クエリを表示します。 –

+0

http://meta.stackoverflow。com/questions/285551/why-may-i-not-upload-images-of-code-on-so-ask-a-question/285557#285557 –

答えて

1

前述のように、TRANSFORM句を使用する動的なピボットcrosstab queryは、他のRDMSでは使用できないMS Access SQLメソッドです。 OPはMySQLバックエンドテーブルをMS Accessフロントエンドアプリにリンクしているので、フロントエンドクロス集計クエリはMySQLデータ上で実行できます。特定のニーズに合わせて

支払人受取人のマッチングの集計クエリを結合ソースクエリを考えます。そして、ソースクエリにクロス集計を実行します。

ソースクエリ

SELECT m1.Payer, m1.Payee, (m1.SumAmount - m2.SumAmount) As NetTransfer 
FROM 
    (SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount 
    FROM Transfers t 
    GROUP BY t.Payer, t.Payee) m1 
INNER JOIN 
    (SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount 
    FROM Transfers t 
    GROUP BY t.Payer, t.Payee) m2 
ON m1.Payer = m2.Payee AND m1.Payee = m2.Payer 

-- Payer Payee NetTransfer 
-- John  Fred    2 
-- Fred  John    -2 
-- Peter John    11 
-- John  Peter   -11 

クロス集計クエリ(構文は、MS Accessでのみ有効です)

TRANSFORM Sum(q.NetTransfer) AS SumOfNetTransfer 
SELECT q.Payer 
FROM SourceQueryQ q 
GROUP BY q.Payer 
PIVOT q.Payee; 

-- Payer Fred John Peter 
-- Fred    -2  
-- John  2    -11 
-- Peter    11  

もちろん、最初のクエリは、クロスタブで派生テーブルとしてネストすることもできます:

複合クエリー

TRANSFORM Sum(q.NetTransfer) AS SumOfNetTransfer 
SELECT q.Payer 
FROM 
    (SELECT m1.Payer, m1.Payee, (m1.SumAmount - m2.SumAmount) As NetTransfer 
    FROM 
     (SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount 
     FROM Transfers t 
     GROUP BY t.Payer, t.Payee) m1 
    INNER JOIN 
     (SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount 
     FROM Transfers t 
     GROUP BY t.Payer, t.Payee) m2 
    ON m1.Payer = m2.Payee AND m1.Payee = m2.Payer) q 
GROUP BY q.Payer 
PIVOT q.Payee; 

:任意のAccessクエリのように、クロス集計は255列に制限されているので、データは254以上の異なる支払者/支払い先が含まれている場合は、PIVOT...IN句を使用列を定義する:

PIVOT q.Payee IN ('Fred', 'John', 'Peter') 
0

ピボットクエリはトリックを行う必要があります。

SELECT Payer, 
     SUM(CASE WHEN Payee = 'Peter' THEN Amount END) AS Peter, 
     SUM(CASE WHEN Payee = 'John' THEN Amount END) AS John, 
     SUM(CASE WHEN Payee = 'Fred' THEN Amount END) AS Fred 
FROM yourTable 
GROUP BY Payer 

使用しているデータベースに応じて、あなたはピボット機能に建てられたいくつかの利点を取ることができるかもしれません。また、出力を通貨として書式設定するか、金額がない場合はダッシュを使用して書式設定すると、データベース固有のものになります。

+0

お寄せいただきありがとうございます!しかし、私はあなたのクエリで私は手動で名前を入力する必要があるため、私は別の何かが必要なのだろうかと思います。私の例では、3つの名前しか言及していませんでしたが、実際にはデータベーステーブルには何百もの名前が含まれています。私はデータベーステーブルにあるすべての名前を使ってクエリを入力するよりも良い方法があると思っています(そして、少なくとも私のテーブルに新しい名前をつけるたびにクエリを変更します)。 アイデアはありますか? –

+0

@DavidP。私はそれが完全にデータベースに固有の動的SQLが必要になるのではないかと心配しています。あなたのデータベースを見つけてから、Googleの「動的なピボットクエリ」を見つけてください。 –

+0

私のデータベースはMySQLですが、私のフロントエンドはMS Accessですので、MS AccessのSQLでクエリを作成する必要があります。 私は動的ピボットクエリのためのgoogle、あなたの提案をありがとうございます。しかし、私はまだ正確なクエリを作成するための任意の助けに感謝します。 –

関連する問題