SQL Group по итоговой проблеме - PullRequest
0 голосов
/ 22 декабря 2011

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

declare @fromdate as date
declare @todate as date
set @fromdate = CONVERT(date,GETDATE()-3,101)
set @todate = CONVERT(date,GETDATE(),101)

USE database
SELECT
    CONVERT(date,created_date,101) as OrdDate,
    col1=   (SELECT COUNT(distinct cust_id) 
        FROM table1 
        WHERE created_date BETWEEN @fromdate and @todate),
    col2=   (SELECT COUNT(distinct cust_id) 
        FROM table1 
        WHERE [status] LIKE 'P%' and created_date BETWEEN @fromdate and @todate),
    col3=   (SELECT COUNT(distinct cust_id) 
        FROM table2 
        WHERE created_date BETWEEN @fromdate and @todate),
    col4=   (SELECT COUNT(distinct cust_id) 
        FROM table2 
        WHERE created_date between @fromdate and @todate and result_error like 'FAIL%')

FROM table1
WHERE created_date BETWEEN @fromdate and @todate

GROUP BY CONVERT(date,created_date,101)
ORDER BY CONVERT(date,created_date,101)

Он считает все дни вместеЯ попытался добавить группу по каждому выражению, нет.Любые предложения?

OrdDate     col1    col2    col3    col4
2011-12-19  5000    4000    3000    2000
2011-12-20  5000    4000    3000    2000
2011-12-21  5000    4000    3000    2000

Что я хочу, что-то вроде этого

OrdDate     col1    col2    col3    col4
2011-12-19  1500    1500    500     750
2011-12-20  2500    750     1000    1000
2011-12-21  1000    1750    1500    250

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

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

Это устранит проблемы с различным количеством строк для каждого агрегата

SELECT
    base.TheDate AS OrdDare,
    ISNULL(T1.C1, 0) AS col1, 
    ISNULL(T2.C2, 0) AS col2, 
    ISNULL(T3.C3, 0) AS col3, 
    ISNULL(T4.C4, 0) AS col4
FROM
    ( -- UNION will also DISTINCT
     SELECT CONVERT(date,created_date,101) AS TheDate FROM table1
     WHERE created_date BETWEEN @fromdate and @todate
     UNION
     SELECT CONVERT(date,created_date,101) FROM table2
     WHERE created_date BETWEEN @fromdate and @todate
    ) base
    LEFT JOIN
    (
     SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C1
        FROM table1 
        WHERE created_date BETWEEN @fromdate and @todate
        GROUP BY CONVERT(date,created_date,101)
    ) T1 ON base.TheDate = T1.TheDate 
    LEFT JOIN
    (
      SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C2
        FROM table1 
        WHERE WHERE [status] LIKE 'P%' and created_date BETWEEN @fromdate and @todate
        GROUP BY CONVERT(date,created_date,101)
    ) T2 ON base.TheDate = T2.TheDate 
    LEFT JOIN
    (
     SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C3
        FROM table2
        WHERE created_date BETWEEN @fromdate and @todate
        GROUP BY CONVERT(date,created_date,101)
    ) T3 ON base.TheDate = T3.TheDate 
    LEFT JOIN
    (
     SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C4
        FROM table2
        WHERE created_date BETWEEN @fromdate and @todate and result_error like 'FAIL%'
        GROUP BY CONVERT(date,created_date,101)
    ) T4 ON base.TheDate = T4.TheDate 
ORDER BY
     base.TheDate;
0 голосов
/ 22 декабря 2011

Попробуйте:

select CONVERT(date,created_date,101) OrdDate,
       count(distinct table1_cust)    col1,
       count(distinct table1_cust_p)  col2,
       count(distinct table2_cust)    col3,
       count(distinct table2_fail)    col4
from
(select distinct 
       created_date,
       cust_id       table1_cust,
       case when [status] LIKE 'P%' then cust_id end
                     table1_cust_p,
       NULL          table2_cust,
       NULL          table2_fail
 FROM table1 
 WHERE created_date BETWEEN @fromdate and @todate
 UNION ALL
 select distinct 
       created_date,
       NULL          table1_cust,
       NULL          cust_order,
       cust_id       table2_cust,
       case when result_error like 'FAIL%' then cust_id end
                     table2_fail
 FROM table2 
 WHERE created_date BETWEEN @fromdate and @todate) v
group by created_date

РЕДАКТИРОВАТЬ: Обновлено после уточнения вопроса.

0 голосов
/ 22 декабря 2011

Вы должны выполнять эту группировку в каждом необходимом совокупном запросе.

В настоящее время вы группируете только по таблице1, и в каждом подзапросе вы также хотите группировать по дате.И вы можете удалить эту группу в основном запросе, я полагаю ...

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