2015-12-30 2 views
0

У меня есть две таблицы, которые я пытаюсь собрать, что для меня сложно. Мои две таблицы: weeks и transactions; Следующий запрос является то, что я создал, чтобы показать все новые клиент на основе впервые они имели сделки с нами:Настройка параметров даты, а затем установление количества

WITH newPat AS 
(
    SELECT 
     clinic, patient_id, MIN(date_entered) AS np_date 
    FROM 
     transactions 
    WHERE 
     impacts = 'P' 
    GROUP BY 
     clinic, patient_id 
) 
SELECT 
    n.clinic, COUNT(n.patient_id) AS new_pats, 
    n.np_date, w.start_week, w.week_id, w.wk_year 
FROM 
    newPat n 
INNER JOIN 
    weeks w ON (n.np_date BETWEEN w.start_week AND w.end_week) 
GROUP BY 
    n.clinic, n.np_date, w.start_week, w.week_id, w.wk_year 

Так WITH является определение даты начала каждого patient_id уникального для . Затем, используя эту информацию, определив, какие week_id данного wk_year совершили эту транзакцию. Это само по себе работает.

Беда в том, что мне также нужно вытащить amount из таблицы транзакций для этих patient_id за данную неделю было новое. Невозможно попытаться вытащить «количество» в WITH, иначе он будет создавать несколько записей как «новые» из-за различного количества. Было бы несколько записей для данного patient_id в те же даты с изменением amount, так как в этой таблице показаны отдельные услуги, даже если они попадают на один и тот же номер транзакции (tran_num). Каким будет лучший способ найти эти данные?

EDIT FOR CLARIFICATION: Спасибо за быстрые комментарии, идентификатор транзакции может произойти снова, если есть какие-либо корректировки, внесенные в него по дороге. Мне нравится идея раздела, но мне нужно больше, чем первая строка, так как может быть несколько строк для одной и той же транзакции и даты. Я довольно новичок в SQL, поэтому я мог бы пропустить что-то простое. Но, по сути, мне нужно (SUM(amount) WHERE date_entered = MIN(date_entered)) и где patient_id AND clinic уникальны.

+0

Почему не вы суммируете выражение 'SUM' в условии with, чтобы они были агрегированы? Или я не понимаю этого требования. – Lock

+0

Я думаю, что вместо СУММ всех сумм он хочет получить единственную сумму самой ранней строки по дате для этой клиники, patient_id. –

ответ

2

Вы могли бы заменить КТР с этим:

WITH newPat AS(
SELECT clinic, patient_id, date_entered AS np_date, amount, 
ROW_NUMBER() OVER (PARTITION BY clinic, patient_id ORDER BY date_entered ASC) AS rn 
FROM transactions 
WHERE impacts='P' 
) 

, а затем добавить к вашему WHERE rn = 1 основному запросу.

0

Используя то, что предложил Tab, это конечный результат, который, казалось, работали:

WITH newPat AS(
SELECT clinic, patient_id, date_entered AS np_date, SUM(amount) AS total, 
ROW_NUMBER() OVER (PARTITION BY clinic, patient_id ORDER BY date_entered ASC) AS rn 
FROM transactions 
WHERE impacts='P' 
GROUP BY clinic, patient_id, date_entered) 
SELECT n.clinic, n.patient_id, n.np_date, w.start_week, w.week_id, w.wk_year, n.total 
FROM newPat AS n INNER JOIN 
dbo.weeks AS w ON n.np_date BETWEEN w.start_week AND w.end_week 
WHERE n.rn=1 

Добавление в SUM (сумма) агрегированные функции, чтобы получить в целом я искал

Смежные вопросы