SQL запрос - Как исключить ГДЕ для конкретного поля - PullRequest
0 голосов
/ 29 июля 2011

См. SQL-запрос ниже, он работает нормально.Он рассчитывает количество Да, НЕ, Другой и номер соответствующего мобильного номера [Поле продаж] (D.MobileNo = S.mobile)

SELECT D.Username, 
      SUM(CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END) as Yes, 
      SUM(CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END) as Not, 
      SUM(CASE WHEN D.type = '' THEN 1 ELSE 0 END) as Other, 
      SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
      COUNT(*) as TOTAL 
FROM dairy as D 
     LEFT JOIN (SELECT DISTINCT mobile FROM sales) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
GROUP BY D.Username 
ORDER BY TOTAL DESC

Я хочу исключить WHERE для поля Salesне должно быть частью от CheckDate.То есть следует проверить любую запись в таблице dairy без CheckDate для поля Sales.

Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Предполагается, что имя пользователя также существует в таблице SALES

SELECT Username,SUM(Yes) As Yes, SUM(`Not`) As `Not`
  , SUM(Other) As Other, SUM(sales) Sales, SUM(total)
FROM (
-- get diary data
SELECT username,mobileNo As mobile, 
      CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END as Yes, 
      CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END as `Not`, 
      CASE WHEN D.type = '' THEN 1 ELSE 0 END as Other, 
      0 As sales, 1 as total
FROM dairy as D 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 

UNION ALL
-- get all sales
SELECT DISTINCT username,mobile, 0 as Yes, 0 as `Not`, 0 As Other, 1 As sales, 0 As total
FROM sales
  WHERE UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
) AS a
GROUP BY Username

Также попробуйте исходный запрос с добавлением даты

SELECT D.Username, 
      SUM(CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END) as Yes, 
      SUM(CASE WHEN D.type = 'Not' THEN 1 ELSE 0 END) as Not, 
      SUM(CASE WHEN D.type = '' THEN 1 ELSE 0 END) as Other, 
      SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
      COUNT(*) as TOTAL 
FROM dairy as D 
     LEFT JOIN (SELECT DISTINCT mobile FROM sales WHERE UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 ) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
      AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 
      AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 
GROUP BY D.Username 
ORDER BY TOTAL DESC
0 голосов
/ 29 июля 2011

Если вы действительно хотите получить эти результаты только в одном запросе, это может помочь.

SELECT D.Username, 
    SUM(CASE WHEN D.type = 'Yes' AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Yes, 
    SUM(CASE WHEN D.type = 'Not' AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Not, 
    SUM(CASE WHEN D.type = ''    AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) as Other, 
    SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales, 
    COUNT(*) as TOTAL,
    SUM(CASE WHEN UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1311894000 THEN 1 ELSE 0 END) AS TOTALINCHECKDATE
FROM dairy as D 
   LEFT JOIN (SELECT DISTINCT mobile FROM sales) as S on D.MobileNo = S.mobile 
WHERE source = 'Network' 
GROUP BY D.Username 
ORDER BY TOTAL DESC

Обратите внимание, что "TOTAL" будет подсчитывать все строки (включая те, которые находятся за пределами диапазона CheckDate), TOTALINCHECKDATE возвращает то же значение, что и в предыдущем запросе.

Очевидно, что это все еще можно оптимизировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...