MySQL - объединение или присоединение? - PullRequest
3 голосов
/ 14 марта 2011

Я пытаюсь собрать статистические данные в одном запросе SQL для удобства автоматической сортировки даты в объединении.Это на самом деле только одна таблица, но я хочу подсчитать разные случаи данных.

Таблица, которую я имею, выглядит примерно так:

ID   In          Wanted
441  2011-03-14  0
439  2011-03-14  1
442  2011-03-14  0
428  2011-03-13  1
431  2011-03-13  1
425  2011-03-11  0
423  2011-03-11  1
420  2011-03-09  1

Я получаю близкий к желаемому результату этот запрос:

SELECT * FROM
(
  (SELECT date(In) n, count(date(In)) cntw, null cntl FROM items i WHERE Wanted=1 group by date(In))
union all
  (SELECT date(In) n, null cntw, count(date(In)) cntl FROM items i WHERE Wanted=0 group by date(In))
) Serie
Order by n DESC

Но закрытие недостаточно близко: D Результат, который я получаю, таков:

n            cntw   cntl
2011-03-14   null   2
2011-03-14   1      null
2011-03-13   2      null
2011-03-11   null   1
2011-03-11   1      null
2011-03-09   1      null

Я хочу, чтобы "смешать" результаты в одной строке,по дате:

n            cntw   cntl
2011-03-14   1      2
2011-03-13   2      null
2011-03-11   1      1
2011-03-09   1      null

Как видите, для каждой даты есть только ОДНА строка.На самом деле, самый совершенный результат - это даже указать отсутствующие даты:

n            cntw   cntl
2011-03-14   1      2
2011-03-13   2      null
2011-03-12   null   null
2011-03-11   1      1
2011-03-10   null   null
2011-03-09   1      null

... но я думаю, что это невозможно.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 марта 2011
select date(In) as n,
       sum(case when wanted = 1 then 1 else 0 end) as cntw,
       sum(case when wanted = 0 then 1 else 0 end) as cntl
    from items
    group by date(In)
    order by n desc
1 голос
/ 14 марта 2011

Вы бы использовали LEFT JOIN, используя ваше поле n, чтобы получить даты, когда у вас есть материал ... Тогда вы бы UNION это сделали с запросом, который дает вам строки, где ничего нет (информацияВы даете выше, не позволяет мне помочь в том, что запрос будет: D).

1 голос
/ 14 марта 2011

Вы хотите присоединиться к ним, я думаю, что это сработает

SELECT * FROM
  (SELECT date(In) n, count(date(In)) cntw, null cntl FROM items i WHERE Wanted=1 group by date(In)) as a
LEFT JOIN
  (SELECT date(In) n, null cntw, count(date(In)) cntl FROM items i WHERE Wanted=0 group by date(In)) as b
ON a.n = b.n
Order by n DESC

Но я думаю, что это можно сделать одним запросом, например, возможно?

CREATE TABLE #tmpFoo (
    SomeDate datetime,
    Wanted bit
)

INSERT INTO #tmpFoo VALUES ('2011-03-11', 0)
INSERT INTO #tmpFoo VALUES ('2011-03-11', 1)
INSERT INTO #tmpFoo VALUES ('2011-03-12', 0)
INSERT INTO #tmpFoo VALUES ('2011-03-12', 1)
INSERT INTO #tmpFoo VALUES ('2011-03-14', 0)

SELECT  SomeDate n, 
        count(NULLIF(Wanted,0)) cntw, 
        count(NULLIF(Wanted,1)) cntl 
    FROM #tmpFoo i  
    GROUP BY SomeDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...