0

選択した日付(2012-07-01-2012-08-01)の間に結果を返すSQLクエリを実行しています。しかし、値からそれらが間違っていることがわかります。

構文エラーがあると表示されないので混乱していますが、返される値が間違っています。

私のデータベースの日付は、YYYY-mm-ddの形式で日付列に保存されます。

SELECT `jockeys`.`JockeyInitials` AS `Initials`, `jockeys`.`JockeySurName` AS Lastname`,
       COUNT(`runs`.`JockeysID`) AS 'Rides', 
       COUNT(CASE
                  WHEN `runs`.`Finish` = 1 THEN 1 
                  ELSE NULL 
             END
             ) AS  `Wins`, 
        SUM(`runs`.`StakeWon`) AS 'Winnings'
  FROM runs
 INNER JOIN jockeys ON runs.JockeysID = jockeys.JockeysID
 INNER JOIN races ON runs.RacesID = races.RacesID
 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <= STR_TO_DATE('2012,08,01', '%Y,%m,%d')
 GROUP BY `jockeys`.`JockeySurName` 
 ORDER BY `Wins` DESC`
4

2 に答える 2

1

あなたの質問から問題が何であるかを推測するのは難しいです。

7月のすべてのレースと8月1日のレースを要約したいとお考えですか?それは少し奇妙な日付範囲です。

より正確にしたい場合は、次の種類の日付範囲の選択を試してください。races.RaceDate列がDATETIME式である場合は、これを使用する必要があります。

 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <  STR_TO_DATE('2012,08,01', '%Y,%m,%d') + INTERVAL 1 DAY

これにより、7月のレースと8月1日のレースがいつでもピックアップされます。

しかし、7月のレースだけを探している可能性があります。その場合、次のことを試してみてください。

 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <  STR_TO_DATE('2012,07,01', '%Y,%m,%d') + INTERVAL 1 MONTH

これにより、7月1日深夜から8月1日深夜まですべてがピックアップされます。

GROUP BYまた、正しく使用していません。要約する場合、結果セットのすべての列は、要約(SUM()またはCOUNT()その他の集計関数)であるか、GROUPBY句で言及されている必要があります。一部のDBMSはこれを強制します。MySQLはそれと一緒に回転し、奇妙な結果をもたらします。この式を試してください。

GROUP BY `jockeys`.`JockeyInitials`,`jockeys`.`JockeySurName` 
于 2012-09-27T17:12:52.167 に答える
1

私の一番の推測は、冗談っぽい名前はユニークではないということです。groupby式を次のように変更してみてください。

group by `jockeys`.`JockeyInitials`, `jockeys`.`JockeySurName`

一般にSELECT、行に含まれていない列を集計クエリの句に含めることはお勧めできませんGROUP BY。隠し列と呼ばれる(誤った)機能があるため、MySQLでこれを行うことができます(他のデータベースではできません)。

于 2012-09-27T17:53:26.513 に答える