4

昨日、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 日に存在する必要があります。

4

1 に答える 1