前述のように、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')
質問を編集してクロス集計クエリを表示します。 –
http://meta.stackoverflow。com/questions/285551/why-may-i-not-upload-images-of-code-on-so-ask-a-question/285557#285557 –