2012-03-03 7 views
0

структуры таблицы:
tblCustomerОбъединение двух запросов в один

Customer_id created     field1   field2  cardno 
-------------------------------------------------------------------------------  
1014   2010-05-25 12:51:59.547 Cell Phone  [email protected] 1234567890 
1015   2010-08-15 12:51:59.547 Email    [email protected] 2345678891 

tbl_TransactionDishout

Trnx_id offerNo TerminalID  Created     VirtualCard 
------------------------------------------------------------------- 
1   1014  170924690436418 2010-05-25 12:51:59.547 1234567890 

Можно ли получить результат, как показано ниже даты мудр записей:

   Enrolled Enrolled as Email Enrolled as Text Deals Redeemed 
<First Date> 7   5     2    6 
<Next Date> 9   3     6    14 

У меня есть два разных запроса, которые мне нужно объединить в один. Первый:

select 
    CAST(FLOOR(CAST(t.created AS FLOAT)) as Datetime) created, 
    count(field1) Enrolled, count(case field1 when 'E-mail' then 1 end) Enrolled_as_Email, 
    count(case field1 when 'Cell Phone' then 1 end) Enrolled_as_Cell 
    from tblCustomer as t 
    group by t.created 
    order by t.created desc 

Какие Дисплей:

create     Enrolled Enrolled_as_Email Enrolled_as_Cell 
    ---------------------------------------------------------------------- 
    2012-03-01 00:00:00.000 3  1    2 
    2012-02-29 00:00:00.000 1  0    1 

Второй:

select CAST(FLOOR(CAST(t.created AS FLOAT)) as Datetime) created, 
    count(*) [Deals_Redeemed] from tbl_TransactionDishout t 
    left join tblCustomer c on t.VirtualCard = c.cardno 
    group by CAST(FLOOR(CAST(t.created AS FLOAT)) as Datetime) 
    order by t.created desc 

который отображает:

create     Deals_Redeemed 
    --------------------------------------- 
    2012-03-02 00:00:00.000 1 
    2012-03-01 00:00:00.000 6 
    2012-02-28 00:00:00.000 1 
    2012-02-27 00:00:00.000 2 

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

Но это дает мне результат дня, содержащийся только в tblCustomer таблице ..

Теперь, как получить Deals_redeemed ..? соотношение между tbl_transaction и tblCustomer оказывает такой же cardno ...

ответ

2
SELECT 
    CAST(t1.created AS DATE) created, 
    COUNT(t1.field1) Enrolled, 
    COUNT(CASE t1.field1 WHEN 'E-mail' THEN 1 END) Enrolled_as_Email, 
    COUNT(CASE t1.field1 WHEN 'Cell Phone' THEN 1 END) Enrolled_as_Cell, 
    COUNT(t2.created) Deals_Redeemed 
FROM tblCustomer AS t1 
LEFT JOIN tbl_TransactionDishout t2 
    ON t1.cardno = t2.VirtualCard 
GROUP BY CAST(t1.created AS DATE) 
ORDER BY CAST(t1.created AS DATE) DESC 

Edit: Изменено условие cardno, и изменяется от FULL JOIN до LEFT JOIN.

+0

Ниццы (+1), но будет не Поступили ... поля не существующие в запросе 2 результата в NULL результатов для этих полей в сумме столбцах помимо Deals_Redeemed? – Tahbaza

+0

Добавил 'ISNULL', чтобы учесть это. Второй запрос не требует 'ISNULL' в полях. –

+0

Да. Ваш второй ответ почти правильный, за исключением одного условия, которое является «t1.cardno = t2.VirtualCard» на ВНЕШНЕМ СОЕДИНЕНИИ Условие ... Спасибо большое @MizardX ... –

1

Вы мог Pivot():

select [create] 
, sum([Email]+[Cell Phone]) as [Enrolled] 
, max([Email]) as [Enrolled as Email] 
, max([Cell Phone]) as [Enrolled as Cell Phone] 
, max([Deal Redeemed]) as [Deals Redeemed] 
from (
    select [create]=created 
    , create1=created 
    , field1 
    from tblCustomer 
    union all 
    select [create]=created 
    , create1=created 
    , field1='Deal Redeemed' 
    from tbl_TransactionDishout 
) p 
pivot (
    count(create1) 
    for field1 in ([Cell Phone],[Email],[Deal Redeemed]) 
) pv 
group by [create] 
order by [create] 
+1

Msg 325, уровень 15, состояние 1, строка 17 Неправильный синтаксис около «поворота». Возможно, вам потребуется установить уровень совместимости текущей базы данных на более высокое значение, чтобы включить эту функцию. См. Справку для опции SET COMPATIBILITY_LEVEL для ALTER DATABASE. –