1

次のテーブルを持つデータベースがあります。

次の列を持つcustomer_infoテーブル:

custID | storeName     | accName
  1    |  bayport      | name one
  2    |  plainfield   | name two
  3    |  bayport      | name three

次の列のdealsテーブル:

dealID | dealDate     | custID
  1    | 2012-10-15   |   1
  2    | 2012-11-25   |   2
  3    | 2012-12-17   |   3
  4    | 2012-12-17   |   1

次の列を持つphone_detailsテーブル

phone_ID  | instore  | online  | received | dealID  
    1     |    1     |    0    |    0     |   1
    2     |    1     |    0    |    0     |   1
    3     |    0     |    1    |    1     |   1    
    4     |    0     |    1    |    0     |   2
    5     |    0     |    1    |    0     |   3
    6     |    0     |    1    |    1     |   3
    7     |    1     |    0    |    1     |   4
    8     |    1     |    0    |    1     |   4

請求の詳細

payment_ID   | due  | paid | tender | dealID
      1      | 1000 | 500  | cash   |    1    
      2      | 500  | 100  | credit |    2 
      3      | 200  | 200  | cash   |    3 
      4      | 350  | 350  | debit  |    4

このテーブルをクエリして、特定の日付の結果がこのようになるようにするにはどうすればよいですか?

たとえば、2012-10-15-2012-11-25は次のようになります

               | bayport |   plainfield 
# of instore   |    2    |       0
# of online    |    1    |       1
total          |    3    |       1
# of received  |    1    |       0
total amount   |  1000   |      500
4

2 に答える 2

3

@MichaelBerkowskiの優れた回答とは対照的に、bayport / plainfieldを行として、instore / onlineを列として(上記の私のコメントによる)データ指向を許容できる場合は、次のようにすることができます。

SELECT    c.storeName,
          SUM(p.instore) AS `# of instore`,
          SUM(p.online ) AS `# of online`
FROM      customer_info c
LEFT JOIN deals         d
       ON d.custID    = c.custID
      AND d.dealDate  = '2012-10-15'
LEFT JOIN phone_details p USING (dealID)
GROUP BY  storeName

sqlfiddleでそれを参照してください。

于 2013-01-04T02:03:10.050 に答える
2

これは間違いなく奇妙な構成です。

これには、それぞれの値と値をUNION ALL取得して、列ではなく行にする必要があります。次に、を使用してピボットされ、ストア名が列に変換されます。onlineinstoreSUM(CASE...)

SELECT 
  calltype,
  /* In the outer query, pivot the storeName */
  SUM(CASE WHEN storeName = 'bayport' THEN num ELSE 0 END) AS bayport,
  SUM(CASE WHEN storeName = 'plainfield' THEN num ELSE 0 END) AS plainfield
FROM (
    /* First half gets the instore */
    SELECT
      /* String literal for label column */
      '# of instore' AS calltype,
      COUNT(*) AS num,
      storeName
    FROM
      customer_info c
      LEFT JOIN deals d ON c.custID = d.custID
      LEFT JOIN phone_details p ON d.dealID = p.dealID
    WHERE instore = 1 AND dealDate = '2012-10-15'
    GROUP BY storeName, calltype
    UNION ALL
    /* Second half gets the online */
    SELECT
      '# of online' AS calltype,
      SUM(online) AS num,
      storeName
    FROM
      customer_info c
      LEFT JOIN deals d ON c.custID = d.custID
      LEFT JOIN phone_details p ON d.dealID = p.dealID
    WHERE online = 1 AND dealDate = '2012-10-15'
    GROUP BY storeName, calltype
) totals 
GROUP BY calltype, storeName

http://sqlfiddle.com/#!2/af18b/13

于 2013-01-04T01:46:11.630 に答える