2017-07-19 8 views
1

過去2日間、私はこれを理解しようとしてきました。これは私が簡単だと思っていたものですが、私の人生にとって必要なSQLクエリを理解することはできません。私はいくつかの関連する質問/答えを見つけましたが、まさに私が取り組んでいるものではありません。過去7日間のMySQLカウントレコードをレコード別にグループ化し、ゼロレコードで集計しました。

私は週の過去7日間のレコード数を取得し、ブランチロケーション別にグループ化し、レコードが見つからない場合は0を含めようとしています。誰もが言ったことの1つは、カレンダー/日付ヘルパー・テーブルを生成し、それを結合する必要があるということです。私は行ってこれをやって、今は2000-01-012040-01-01の間の日付のカレンダーテーブルを持っています。のは、それが現在2017-04-07だというふりをしてみましょう

Records | location | date | thing | |----------|------------|---------| | Branch 1 | 2017-04-01 | Thing 1 | | Branch 2 | 2017-04-03 | Thing 2 | | Branch 1 | 2017-04-03 | Thing 3 | | Branch 1 | 2017-04-01 | Thing 4 | | Branch 3 | 2017-04-01 | Thing 5 | | Branch 3 | 2017-04-02 | Thing 6 | | Branch 1 | 2017-04-02 | Thing 7 | | Branch 2 | 2017-04-07 | Thing 8 |

:ここ

は、私のテーブル構造は次のようになります。 2017-04-012017-04-07を含むすべての日付がレコードテーブルにあるわけではないので、私はカレンダーヘルパーテーブルが必要でした。それは、私は次の出力を取得しようとしている、言われている:

Output | location | date | count(things)| |----------|------------|--------------| | Branch 1 | 2017-04-01 | 2 | | Branch 1 | 2017-04-02 | 1 | | Branch 1 | 2017-04-03 | 1 | | Branch 1 | 2017-04-04 | 0 | | Branch 1 | 2017-04-05 | 0 | | Branch 1 | 2017-04-06 | 0 | | Branch 1 | 2017-04-07 | 0 | | Branch 2 | 2017-04-01 | 0 | | Branch 2 | 2017-04-02 | 0 | | Branch 2 | 2017-04-03 | 1 | | Branch 2 | 2017-04-04 | 0 | | Branch 2 | 2017-04-05 | 0 | | Branch 2 | 2017-04-06 | 0 | | Branch 2 | 2017-04-07 | 1 | | Branch 3 | 2017-04-01 | 1 | | Branch 3 | 2017-04-02 | 1 | | Branch 3 | 2017-04-03 | 0 | | Branch 3 | 2017-04-04 | 0 | | Branch 3 | 2017-04-05 | 0 | | Branch 3 | 2017-04-06 | 0 | | Branch 3 | 2017-04-07 | 0 |

ので、ゼロの記録があったとしても、私はまだ(過去7日間)場所と日付の行を表示したいです。これは達成可能ですか?どちらのクエリは私が探しているものに似ても似つかない、同じ結果が得られ

SELECT 
    `records`.`location`, 
    `calendar`.`date`, 
    COUNT(`records`.`thing`) AS `count` 
FROM `records` 
    RIGHT JOIN `calendar` ON `records`.`date` = `calendar`.`date` 
WHERE `calendar`.`date` >= '2017-04-01' AND `calendar`.`date` <= '2017-04-07' 
GROUP BY `calendar`.`date`, `records`.`location` 
ORDER BY `records`.`location` ASC, `calendar`.`date` ASC 

SELECT 
    `records`.`location`, 
    `date`.`ymd`, 
    COUNT(`records`.`thing`) AS `count` 
FROM (
    SELECT 
     `calendar`.`date` AS `ymd` 
    FROM `calendar` 
    WHERE `calendar`.`date` >= '2017-04-01' AND `calendar`.`date` <= '2017-04-07' 
) `date` 
    LEFT JOIN `records` ON `date`.`ymd` = `records`.`date` 
GROUP BY `records`.`location`, `date`.`ymd` 

:ここ

は、私はいじりてきたクエリですために。

助けてください!

+0

ブランチ/ロケーションテーブルはありますか? – Sal

答えて

1

あなたは完全なリストが必要なだけでなく、ブランチも必要です。私はすべての場所を含む派生テーブルを追加し、以前の結果セットにそれを追加しました。また、selectリストとgroup by句のlocationフィールドは、この派生テーブルから取得する必要があります。

SELECT 
    t.`location`, 
    `calendar`.`date`, 
    COUNT(`records`.`thing`) AS `count` 
FROM `records` 
RIGHT JOIN (`calendar` 
JOIN (select distinct location from records) t) ON `records`.`date` = `calendar`.`date` and t.location=records.location 
WHERE `calendar`.`date` >= '2017-04-01' AND `calendar`.`date` <= '2017-04-07' 
GROUP BY `calendar`.`date`, t.`location` 
ORDER BY `records`.`location` ASC, `calendar`.`date` ASC 
+0

完璧!ありがとうございました! –

関連する問題