0

2 つのテーブルを用意します。

CREATE  TABLE IF NOT EXISTS `issue_details` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    amt_offer_dlr INT NOT NULL DEFAULT 9999 COMMENT '564,510,000',
   maturity  DATE NOT NULL DEFAULT '1111-11-11' COMMENT '06/28/2012' ,
    fk_cusip6 VARCHAR(6) NOT NULL DEFAULT '' COMMENT '' ,
  PRIMARY KEY (id),
  CONSTRAINT con_issue_details__issuers FOREIGN KEY (fk_cusip6) REFERENCES issuers    (fk_cusip6) ON DELETE NO ACTION ON UPDATE CASCADE
)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `identifiers` (
  id     INT NOT NULL AUTO_INCREMENT ,
  fk_cusip6 VARCHAR(6)  NOT NULL DEFAULT 'NA' ,
  PRIMARY KEY (id) ,
  CONSTRAINT con_ident__cusip6  FOREIGN KEY (fk_cusip6) REFERENCES cusip_6 (cusip6) ON DELETE NO ACTION ON UPDATE CASCADE ,
)
COMMENT ''
 ENGINE = InnoDB;

issue_details テーブル: 注: 各 ID は異なり、複数の同一の fk_cusip6 番号を持つことができます

+-----+--------------+------------+----------------+
| id  | maturity     | fk_cusip6  |  amt_offer_dlr |
+-----+--------------+------------+----------------+
|  1  | 2013-06-28   | 567090     |  1000          |
|  2  | 2014-06-05   | 567090     |  1000          |
|  3  | 2013-06-05   | 567100     |  2500          |
|  3  | 2014-06-05   | 567100     |  2500          |
+-----+--------------+------------+----------------+

識別子テーブル: 注: fk_cusip6 番号はそれぞれ異なります

+--------+-----------+
| id     | fk_cusip6 |
+--------+-----------+
| 131472 | 567090    |
| 131473 | 567100    |
+--------+-----------+

ID テーブルの fk_cusip6 の各インスタンスに一致するクエリを生成し、issue_details テーブルに同じ fk_cusip6 を持つすべてのインスタンスの amt_offer_dlr を合計する必要があります。最終結果は次のようになります。

+--------------+---------+------------------------+
| ide.id | isd.fk_cusip6 |  SUM(isd.Amt_Offer_Dlr |
+--------------+---------+------------------------+
| 131472 | 567090        | 2000                   |
| 131473 | 567100        | 5000                   |
+--------------+---------+------------------------+

私は試した:

SELECT CURRENT_DATE, FORMAT(SUM(isd.Amt_Offer_Dlr),0) 'Current Out Standing Debt:'
from muni.issue_details isd
INNER JOIN identifiers ide ON ide.fk_cusip6 = isd.fk_cusip6 AND  isd.fk_cusip6 = '567541'
where isd.maturity > CURRENT_DATE
;

これは、すべての列を合計しています。

サブクエリが必要だと思いますが、詳細にこだわっています。

ありがとう

4

2 に答える 2

2

SQL のクエリ プロセスを 3 フェーズのアクティビティと考えてください。これは、実際に起こっていることのすべての豊かさを捉えているわけではありませんが、あなたのケースでは論理的に正確です.

クエリを単純化して、日付/満期チェックを削除し、単一の fk_cusip6 値をチェックしてみましょう。

SELECT SUM(isd.Amt_Offer_Dlr) 
FROM muni.issue_details isd
INNER JOIN identifiers ide ON ide.fk_cusip6 = isd.fk_cusip6

フェーズ 1 は、考慮すべきすべての行のリストを生成するためのテーブルの結合です。上記の単純化された例では、issue_details と fk_cusip6 で一致する識別子の間の結合を見ています。このフェーズでは、4 つの行のリストが生成されます (issue_details 行ごとに 1 つ、対応する識別子の行が追加されます)。

これにより、次のような構造が得られます。

+-----+--------------+------------+----------------+---------+----------------+
| id  | maturity     | fk_cusip6  |  amt_offer_dlr | ide.id  | ide.fk_cusip6  |
+-----+--------------+------------+----------------+---------+----------------+
|  1  | 2013-06-28   | 567090     |  1000          |  131472 |  567090        |
|  2  | 2014-06-05   | 567090     |  1000          |  131472 |  567090        |
|  3  | 2013-06-05   | 567100     |  2500          |  131473 |  567100        |
|  3  | 2014-06-05   | 567100     |  2500          |  131473 |  567100        |
+-----+--------------+------------+----------------+---------+----------------+

さて、次のような非集計 SQL ステートメント:

SELECT *
FROM muni.issue_details isd
INNER JOIN identifiers ide ON ide.fk_cusip6 = isd.fk_cusip6

そのテーブルだけを返します。しかし、SUM() による集計があるので、フェーズ 2 に進みます。

フェーズ 2 では、集約を実行するためにどの行をまとめてバケット化する必要があるかを決定します。バケットと言いますが、SQL 用語では、どの行がグループ化されるかを言います。これは、GROUP BY 句を使用する可能性があることを意味します。ただし、このクエリには GROUP BY 句がないため、クエリ プロセッサはすべての行を 1 つのバケットにグループ化することを選択する必要があります。これはあなたが望んでいるものではありませんが、行をグループ化する方法についての指示がなければ、これはプロセッサが行う必要があることです。したがって、集計は 4 つの行すべてに対して 1 つの集計を実行します。

フェーズ 3 は、実際の集計そのものです。ここで、4 つの行すべての結果を合計します。上記のサンプル クエリでは、1000+1000+2500+2500、つまり 7000 という出力が表示されます。これも、希望どおりではありません。

次に、次の代替クエリを検討してください。

SELECT ide.id, isd.fk_cusip6, SUM(isd.Amt_Offer_Dlr) 
FROM muni.issue_details isd
INNER JOIN identifiers ide ON ide.fk_cusip6 = isd.fk_cusip6
GROUP BY ide.id, isd.fk_cusip6

このクエリのフェーズ 1 は前と同じです。内部結合の結果として 4 つの行が生成されます。

ただし、フェーズ 2 では GROUP BY があるため、クエリ プロセッサはフェーズ 1 の行を identifiers.id の値ごとに個別のバケットにバケット化します。したがって、次のようになります。

+------+-----+--------------+------------+------- ------+---------+-----------------+ |バケツ | ID | 成熟度 | fk_cusip6 | amt_offer_dlr | ide.id | iden.fk_cusip6 | |------+-----+--------------+------------+------- ------+---------------------+-----------------+ | あ | 1 | 2013-06-28 | 567090 | 1000 | 131472 | 567090 | | | あ | 2 | 2014-06-05 | 567090 | 1000 | 131472 | 567090 | |------+-----+--------------+------------+------- ------+---------------------+-----------------+ | ビ | 3 | 2013-06-05 | 567100 | 2500 | 131473 | 567100 | | | ビ | 3 | 2014-06-05 | 567100 | 2500 | 131473 | 567100 | +------+-----+--------------+------------+------- ------+---------------------+-----------------+

(この幅の表をフォーマットする方法がわかりませんでした)

バケット A はすべて identifiers.id=131472 の行であり、バケット B は identifiers.id=131473 です。

フェーズ 3 では、各バケットの集計が実行され、目的の結果が得られます。

+--------------+---------+------------------------+
| ide.id | isd.fk_cusip6 |  SUM(isd.Amt_Offer_Dlr |
+--------------+---------+------------------------+
| 131472 | 567090        | 2000                   |
| 131473 | 567100        | 5000                   |
+--------------+---------+------------------------+

適用したい他の検索基準が単純である限り、サブクエリは必要ないと思います。しかし、それでも条件が複雑になると、それらがサブクエリ、結合句、または全体的な WHERE 句自体のいずれに含まれるかを把握する必要があり、混乱を招く可能性があります。選択をできるだけシンプルに保つようにしています。

于 2012-11-11T03:46:52.997 に答える
2

これを試して:

SELECT
    i.id,
    i.fk_cusip6,
    x.amt_offer_dlr_sum

FROM identifiers i

INNER JOIN (
    SELECT
        id.fk_cusip6,
        SUM(id.amt_offer_dlr) AS amt_offer_dlr_sum
    FROM issue_details id
    GROUP BY id.fk_cusip6
) x
ON x.fk_cusip6 = i.fk_cusip6;
于 2012-11-11T03:21:58.630 に答える