2012-05-02 1 views
0

は、ここで私が持っているものの大まかな考えです:列ヘッダーとしてフィールドの値を含む結果セットを返すにはどうすればよいですか?

+---------------+ +-----------------+ +---------------+ 
| customers  | | transactions | | branches  | 
+---------------+ +-----------------+ +---------------+ 
| customerid | | orderid   | | branchid  | 
|    | | customerid (FK) | |    | 
|    | | branchid (FK) | |    | 
+---------------+ | datetime  | +---------------+ 
        +-----------------+ 

は、どのように私は日/週の/ etcあたりのトランザクション数で引っ張るクエリを作成します。ブランチドごとにを個別に

私はこのような組合を試しました(すべての土曜日のみにカウントします)。結果は得られるが、望む形式ではない。

SELECT COUNT(orderid) as count1 FROM transactions WHERE WEEKDAY(datetime) = 5 
AND branchid = 'branch1' 
UNION 
SELECT COUNT(orderid) as count2 FROM transactions WHERE WEEKDAY(datetime) = 5 
AND branchid = 'branch2' 

リターン:

+------------+ 
| count1 | 
+------------+ 
|  152 | 
|   48 | 
+------------+ 

私は次のようにフォーマットされるデータをご希望のに対し:

+------------+------------+ 
| count1 | count2 | 
+------------+------------+ 
|  152 |   48 | 
|   |   | 
+------------+------------+ 

誰もがこれを行う方法上の任意のヒントを持っていますか?前もって感謝します!

答えて

2

これを実現するには、いくつかの方法があります。 UNIONを既に使用している場合は、サブクエリを中心にピボットクエリを作成できます。このバージョンでは、元のUNIONの各列にスタティックnameが追加され、外部クエリのCASEステートメントを区別するために使用されます。

あなたのケースでは、SELECTリスト内のサブセレクトで行うことができますが、この方法は他の種類のピボットクエリに対してより拡張性があり、より一般的な方法です。

SELECT 
    SUM(CASE WHEN name = 'count1' THEN counts ELSE 0 END) AS count1, 
    SUM(CASE WHEN name = 'count2' THEN counts ELSE 0 END) AS count2 
FROM (
    SELECT 'count1' as name, COUNT(orderid) as counts FROM transactions WHERE WEEKDAY(datetime) = 5 
    AND branchid = 'branch1' 
    UNION 
    SELECT 'count2' as name, COUNT(orderid) as counts FROM transactions WHERE WEEKDAY(datetime) = 5 
    AND branchid = 'branch2' 
) subq 
+0

ありがとう、マイケル。これは私が参照していた行に沿ったものです。同様の考え。 – dweiss

+0

ありがとう、私はこのような何かが存在することを知らなかった。非常に便利! –

1

SELECTセクションでCASEを使用し、branch1またはbranch2であるかどうかを確認します。 SELECTでは、それぞれに別々の列を定義できます。 UNIONを行う必要はありません。( 'branch1'、 'branch2')のGROUP BY枝ID WHERE枝IDを実行することができます。理にかなっている?

+0

ありがとうDweiss - あなたとマイケルの両方が素敵な説明をしました。 –

2

あなたが列と行ないとして、それをしたいが、私は、これはあなたが必要と何をすべきと考えているという奇妙です:

SELECT 
(SELECT COUNT(orderid) as count1 FROM transactions WHERE WEEKDAY(datetime) = 5 
AND branchid = 'branch1'), 
(SELECT COUNT(orderid) as count1 FROM transactions WHERE WEEKDAY(datetime) = 5 
AND branchid = 'branch2') 
+0

私はそれが少し厄介なことを知っています - 私は列としてそれらを好きな理由は、テーブルから生成されたチャートがあるため(各列が異なる行として)です。あなたの提案をありがとう。私はなぜこれについて考えなかったのかわかりません。 –

関連する問題