昨日、2 日前と 3 日前の指定された idTest の idObj の数を教えてくれるクエリが必要です。
2 日前にフラグが付けられた idObj の数には、昨日フラグが付けられた idObj が含まれている必要があります。つまり、昨日と 2 日前にフラグが付けられた idObj の数のみを表示する必要があります。3 日前にフラグが立てられた idOjb の数には、昨日、2 日前、3 日前にフラグが立てられた idObj を含める必要があります。
また、「DayBeforeYest」や「TwoDayBefore」ではなく、日付として列の名前が必要です。
以下は私が探しているものです:
idTest 2013-06-29 2013-06-28 2013-06-27
104 9 7 5
105 7 6 2
106 5 3 0
ここで、2013 年 6 月 29 日の idObj カウントには、2013 年 6 月 29 日にのみフラグが立てられた idObj が含まれます。2013 年 6 月 28 日の idObj カウントには、2013 年 6 月 29 日および 2013 年 6 月 28 日にフラグが立てられた idObj が含まれます。2013 年 6 月 27 日の idObj カウントには、2013 年 6 月 29 日、2013 年 6 月 28 日、および 2013 年 6 月 27 日にフラグが立てられた idObj が含まれます。したがって、3 日前の列の idObj カウントは昨日よりも少なくなります。
クエリ
create table tblTest (dateFact date, idTest int, idObj int);
insert into tblTest values
('2013-06-29', 104, 4433), ('2013-06-29', 105, 3345), ('2013-06-29', 106, 5543),
('2013-06-28', 104, 4433), ('2013-06-28', 105, 3345), ('2013-06-28', 106, 4356),
('2013-06-27', 104, 3439), ('2013-06-07', 105, 3345), ('2013-06-07', 106, 8955);
以下は私が思いついたクエリですが、idTest ごとに 2 日目と 3 日目にフラグが立てられた idObj の数をカウントするだけです。前日にフラグが立てられた idObj は考慮されません。また、列名を日付形式で表示しません。
select idTest, max(Yest) as Yest, max(DayBeforeYest) as DayBeforeYest, max(TwoDayBefore) as TwoDayBefore from
(
(select idTest, count(idObj) as Yest, 0 as DayBeforeYest, 0 as TwoDayBefore from tblTest
where dateFact =date_sub(curdate(), interval 1 day) group by idTest)
union
(select idTest, 0 as Yest, count(idObj) DayBeforeYest, 0 as TwoDayBefore from tblTest
where dateFact = date_Sub(curdate(), interval 2 day) group by idTest)
union
(select idTest, 0 as Yest, 0 as DayBeforeYest , count(idObj) TwoDayBefore from tblTest
where dateFact = date_sub(curdate(), interval 3 day) group by idTest) )x
group by idTest;
ありがとうございました!
====================================
編集:
create table tblTest (dateFact date, idTest int, idObj int);
INSERT INTO tblTest
select CURDATE() - INTERVAL 1 DAY, 104, 4433 UNION ALL
SELECT CURDATE() - INTERVAL 1 DAY, 105, 3345 UNION ALL
SELECT CURDATE() - INTERVAL 1 DAY, 106, 5543 UNION ALL
SELECT CURDATE() - INTERVAL 2 DAY, 104, 4433 UNION ALL
SELECT CURDATE() - INTERVAL 2 DAY, 105, 3345 UNION ALL
SELECT CURDATE() - INTERVAL 2 DAY, 106, 4356 UNION ALL
SELECT CURDATE() - INTERVAL 3 DAY, 104, 3439 UNION ALL
SELECT CURDATE() - INTERVAL 3 DAY, 105, 3345 UNION ALL
SELECT CURDATE() - INTERVAL 3 DAY, 106, 8955;
この例では、出力は次のようになります。
idTest 2013-06-30 2013-06-29 2013-06-28
104 1 1 0
105 1 1 1
106 1 0 0
2013 年 6 月 30 日の idTest 104 には 1 つの idObj 4433 があります。 idTest 104 には、idTest 104 の 2013-06-30 または 2013-06-29 のいずれにも含まれない 1 つの idObj 3439 があります。したがって、104 の行の値は 1 1 0 であることがわかります。
2013 年 6 月 30 日の idTest 105 には 1 つの idObj 3345 があります。 105、2013-06-30 および 2013-06-29 にもある 1 つの idObj 3345 があります。したがって、行の値は 1 1 1 になります。
等々...
2013-06-28 に idObj をカウントするには、2013-06-28、213-06-29、2013-06-30 に存在する必要があります。2013-06-29 で idObj をカウントするには、2013-06-29 と 2013-06-30 に存在する必要があります。2013 年 6 月 30 日に idObj をカウントするには、2013 年 6 月 30 日に存在する必要があります。