0

このクエリは機能しないことがわかっていますが、何をしているのかを説明するのに役立つ疑似コードとしてそのまま残しました。過去 1 週間の曜日別の予約テーブルから「予約」と「売上」の合計を取得しようとしています。したがって、Mon1B = 月曜日の予約、Mon1S = 月曜日の売上です。

SELECT  
   CASE WEEKDAY(b.created)
   WHEN 0 THEN (SELECT COUNT(uuid) as Mon1B, SUM(amount) as Mon1S)
   WHEN 1 THEN (SELECT COUNT(uuid) as Tue1B, SUM(amount) as Tue1S)
   WHEN 2 THEN (SELECT COUNT(uuid) as Wed1B, SUM(amount) as Wed1S)
   WHEN 3 THEN (SELECT COUNT(uuid) as Thu1B, SUM(amount) as Thu1S)
   WHEN 4 THEN (SELECT COUNT(uuid) as Wed1B, SUM(amount) as Wed1S)
   WHEN 5 THEN (SELECT COUNT(uuid) as Wed1B, SUM(amount) as Wed1S)
   WHEN 6 THEN (SELECT COUNT(uuid) as Wed1B, SUM(amount) as Wed1S)
END CASE
FROM Bookings b
WHERE b.created > '#week1Start#' and b.created <= '#week1End#'

このようなことを MySQL でどのように行うことができますか?

4

3 に答える 3

3

はい。ただし、case は 1 つの値しか返すことができません。次のように実行できます。

SELECT sum(CASE when WEEKDAY(b.created) = 0 then 1 else 0 end) as Mon1b,
       sum(case when weekday(b.created) = 0 then amount else 0 end) as Mon1S,
       ...
FROM Bookings b
WHERE b.created > '#week1Start#' and b.created <= '#week1End#'

ただし、7 行の方が簡単かもしれません。

select WEEKDAY(b.created), count(*) as cnt, sum(amount) as amt
from Bookings b
WHERE b.created > '#week1Start#' and b.created <= '#week1End#'
group by WEEKDAY(b.created)
order by 1
于 2012-07-26T23:50:59.023 に答える
1

私はあなたがこのようなものが欲しいと思います:

SELECT COUNT(IF(WEEKDAY(b.created)=0,uuid,NULL)) AS Mon1B
     , SUM(IF(WEEKDAY(b.created)=0,amount,NULL)) AS Mon1S
     , COUNT(IF(WEEKDAY(b.created)=1,uuid,NULL)) AS Tue1B
     , SUM(IF(WEEKDAY(b.created)=1,amount,NULL)) AS Tue1S

または、同等の (しかしより長い) CASE 式を好む場合は、次のようにします。

SELECT COUNT(CASE WEEKDAY(b.created) WHEN 0 THEN uuid END) AS Mon1B
     , SUM(CASE WEEKDAY(b.created) WHEN 0 THEN amount END) AS Mon1S
     , COUNT(CASE WEEKDAY(b.created) WHEN 1 THEN uuid END) AS Tue1B
     , SUM(CASE WEEKDAY(b.created) WHEN 1 THEN amount END) AS Tue1S

CASE 式の結果はスカラーです。複数の値を返すことはできません。

于 2012-07-26T23:54:40.190 に答える