AS-B
@AS-B

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

データベースの出力でスキップされてしまうのを回避したいです。

解決したいこと

タイトルが下手ですみません。
以下のコードで、code:4に出力が無いのでスキップされてしまうのですが、数量を0として表示させたいです。

該当するソースコード

<?php
//SQL Server
$server = "XXX";
$database = "XXX";
$user = "XXX";
$password = "XXX";
$conn = odbc_connect("Driver=SQL Server;Server=$server;Database=$database;", $user, $password);

$year = date("Y");
$month = date('m');

$SQL = "SELECT code , SUM(quantity) as qty FROM tablename WHERE MONTH(YMD) = '$month' and YEAR(YMD) ='$year' and code in('01','02','03','04','05','06') GROUP BY code";
$SQLrst = odbc_exec($conn, $SQL);

while (odbc_fetch_row($SQLrst)) {
    echo floor(odbc_result($SQLrst,'code'))."<br>";
    echo floor(odbc_result($SQLrst,'qty'))."<br>";
}

odbc_close($conn);
?>

結果が以下です。

01 →code
1 →qty
02
3
03
3
05
6
06
7

これを、

01 →code
1 →qty
02
3
03
3
04 →これを表示
0 →これを表示
05
6
06
7

としたいです。

自分で試したこと

まずcodeとqtyを確認してみました。

$SQL = "SELECT SUM(quantity) as qty FROM tablename WHERE MONTH(YMD) = '$month' and YEAR(YMD) ='$year' and code ='04'";
//この場合の出力は→0
$SQL = "SELECT code FROM tablename WHERE MONTH(YMD) = '$month' and YEAR(YMD) ='$year' and code ='04'";
//この場合の出力は→何も表示されない(null ?)

そこで、

$SQL = "SELECT code,CASE WHEN code IS NULL THEN '00' ELSE code END , SUM(quantity) as qty FROM tablename WHERE MONTH(YMD) = '$month' and YEAR(YMD) ='$year' and code in('01','02','03','04','05','06') GROUP BY code";

としても

$SQL = "SELECT code,CASE WHEN code = '' THEN '00' ELSE code END , SUM(quantity) as qty FROM tablename WHERE MONTH(YMD) = '$month' and YEAR(YMD) ='$year' and code in('01','02','03','04','05','06') GROUP BY code";

としても結果は変わりませんでした。

何か良い方法をご存知の方いらっしゃいましたら、恐れ入りますがご教授の程よろしくお願い申し上げます。

0

2Answer

SQLでの解決にこだわらないのであれば、プログラムで調整するのはいかがですか?

プログラムで穴埋めするイメージ
// ...
$result = []; // code => qty
while (odbc_fetch_row($SQLrst)) {
    $result[odbc_result($SQLrst,'code')] = odbc_result($SQLrst,'qty');
}

$cords = ['01','02','03','04','05','06'];

foreach ($cords as $cord) {
    echo isset($result[$cord]) ? $result[$cord] : 0;
}
1Like

Comments

  1. @AS-B

    Questioner

    ご教授いただき誠にありがとうございます。
    プログラムで調整する方がまだ理解しやすく、
    echo isset($result[$cord]) ? $result[$cord] : 0;
    で無い物を0にするんだという当たりはつけられました。
    また、whileとforeachを組み合わせたいと前々から思っていましたので、とても参考になり助かりました。
    しかし、全てを理解する事はできませんでしたのでお伺いしたいのですが、ご教授いただいたプログラムの出力は0のみで、
    echo isset($result[$cord]) ? $result[$cord] : 0;
    は、if文のように用いて通常のarray出力に組み合わせるような使い方でしょうか?
    質問文が下手で申し訳ありません。
  2. echo isset($result[$cord]) ? $result[$cord] : 0;
    
    // こちらと同じ結果になります
    if (isset($result[$cord])) {
        echo $result[$cord];
    } else {
        echo 0;
    }
    

    この部分で使われている? :は三項演算子と言い、if文を簡略化したようなものです。
    条件文によってどちらかの値となるので、それを出力するなり変数に格納するなりできます。

  3. @AS-B

    Questioner

    コメントありがとうございます。
    すみません、私のミスがありました。
    クエリのために、
    $CD ="'01','02','03','04','05','06',・・・";
    という物がありまして、
    $cords = [$CD];
    としたのがダメだったようです。(初心者にはOKな気がしてしまいまして・・・)
    実際はコードが130個あるので省略のつもりでしたが、ちゃんと$cordsに全部書けばうまく動きました。
    ありがとうございました。

コードを管理するマスタがあれば、それをメインテーブルとしてjoinするように取得すれば解決すると思います。

マスタがない場合に、別月にデータがある前提にはなりますが、
以下のようなクエリでも数量0として取得できるようになります。

SELECT main.code 
      ,ISNULL(sub.qty, 0) as qty
FROM
(
    SELECT DISTINCT(code)
    FROM tablename
) main
LEFT JOIN
(
    SELECT code 
          ,SUM(quantity) as qty 
    FROM tablename
    WHERE MONTH(YMD) = 4 
      and YEAR(YMD) =2023
    GROUP BY code
) sub
on main.code = sub.code
WHERE main.code in ('01','02','03','04','05','06');
0Like

Comments

  1. @AS-B

    Questioner

    ご教授いただき誠にありがとうございます。
    私にはかなり難しく、初めて見るワードや文法ばかりですので1つずつ理解したいと思います。
    目的は達成され、0を取得できるようになりました。

    よろしければ追加で1つお伺いしたいのですが、このクエリの場合ORDER BY句はどこに入るのが適正でしょうか?
  2. >よろしければ追加で1つお伺いしたいのですが、このクエリの場合ORDER BY句はどこに入るのが適正でしょうか?

    一番最後にORDER BY句を付与すればOKです。
  3. @AS-B

    Questioner

    コメントありがとうございます。
    実は一番最後にORDER BY句をつけてエラーになってしまい、場所が違うのか?といろいろな場所で試してもエラーという流れでお伺いしておりました。
    場所に自信が持てたので、もしやと思い試してみたのが、

    WHEN code='01' THEN 1・・・エラー

    WHEN main.code='01' THEN 1・・・OK!

    という事で無事クリアできました。
    重ねて御礼申し上げます。
    本当にありがとうございました。

Your answer might help someone💌