Исключить повторяющиеся строки в результате запроса - PullRequest
0 голосов
/ 08 февраля 2011

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

Например, у меня есть такая таблица.

table
jobd  +  name
    1  |  jobA
    2  |  jobB

tableA
imgeid  +  orderid   +    jobid   
      1 |  1         |    1
      2 |  2         |    1
      3 |  3         |    1
      4 |  4         |    1    (this order is not yet started)

tableB
taskid  +  orderid   +    task  +  status
      1 |  1         |    1     |  UPDATED
      2 |  1         |    1     |  UPDATED
      3 |  1         |    1     |  COMPLETED
      4 |  2         |    2     |  SAVED
      5 |  3         |    3     |  COMPLETED

Моя проблема здесь в том, что, когда я считаю на основе статуса (@ tableB), мой запрос приводит к ОБНОВЛЕНИЮ, который имеет тот же orderid.

Это мой пример запроса, аналогичный тому, с которым я работаю.

SELECT t.name
    COUNT(CASE WHEN tb.task = 1 AND tb.status <> 'COMPLETED' THEN tb.status ELSE NULL END) inprogress,
    COUNT(CASE WHEN tb.task = 1 AND tb.status = 'COMPLETED' THEN tb.status ELSE NULL END) completed
FROM tableA ta
LEFT JOIN tableB tb
    ON tb.orderid = ta.orderid
LEFT JOIN table t
    ON t.jobid = ta.jobid
GROUP BY t.jobid;

Мои результаты что-то вроде

name   +    inprogress     +   completed
jobA   |    2              |   1

Результаты выполнения должны быть только 1, потому что он имеет тот же orderid. Причина, по которой он имеет два ОБНОВЛЕННЫХ, потому что эта таблица ИСТОРИЧЕСКАЯ. Я не знаю, как можно получить различный orderid в таблице B, так что это приведет только к 1.

Суть в том, что я могу подсчитать общее количество заказов, статус которых выполняется, завершен и не запущен по заданию.

Надеюсь, мой вопрос ясен. Если у вас есть другой способ, пожалуйста, дайте мне знать. Спасибо

1 Ответ

0 голосов
/ 08 февраля 2011

Разве вы не можете использовать счетчик? Вот ссылка, смотрите ближе внизу страницы, это будет только уникальное поле, которое вы укажете: w3schools.com/sql/sql_func_count.asp

SELECT t.name
COUNT(DISTINCT tb.orderid CASE WHEN tb.task = 1 AND tb.status  'COMPLETED' THEN tb.status
ELSE NULL END) inprogress,
COUNT(DISTINCT tb.orderid CASE WHEN tb.task = 1 AND tb.status = 'COMPLETED' THEN tb.status
ELSE NULL END) completed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...