2013-09-10 4 views
0

Следующий SQL делает почти то, что я хочу.Как я могу улучшить этот союз?

SELECT p.ProductNumber "Plan Number", 
     p.Name, 
     p.price   "Monthly Rate", 
     count(*)  "Group", 
     '0'    "Direct Debit" 
FROM contact c, 
     product p 
WHERE c.integ_schemeid = p.ProductId 
     AND c.ParentCustomerId IS NOT NULL 
GROUP BY p.ProductNumber, 
      p.Name, 
      p.price 
UNION 
SELECT p.ProductNumber "Plan Number", 
     p.Name, 
     p.price   "Monthly Rate", 
     '0'    "Group", 
     count(*)  "Direct Debit" 
FROM contact c, 
     product p 
WHERE c.integ_schemeid = p.ProductId 
     AND c.ParentCustomerId IS NULL 
GROUP BY p.ProductNumber, 
      p.Name, 
      p.price 

С результатами:

enter image description here

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

Возможно ли это в T-SQL?

+0

ПРИСОЕДИНЯЙТЕСЬ К СЕБЕ, КОТОРЫЕ ИСПОЛЬЗУЮТ КОЛОНКИ, КОТОРЫЕ ИМЕЛИ ЗНАЧЕНИЯ ... ON t1.PlanNumber = t2.PlanNumber и t1.name = t2.name и t1.monthlyrate = t2.monthly rate – zxc

ответ

2

Попробуйте

select p.ProductNumber "Plan Number",p.Name,p.price "Monthly Rate", 
    count(CASE WHEN c.ParentCustomerId IS NOT NULL THEN 1 END) "Group", 
    count(CASE WHEN c.ParentCustomerId IS NULL THEN 1 END) "Direct Debit" 
from contact c,product p 
where c.integ_schemeid = p.ProductId 
group by p.ProductNumber,p.Name,p.price 

В случае отказа от CASE WHEN, то CASE вернется NULL и COUNT не "рассчитывать" NULL значения. Значение 1 является случайным. Это означает только «не NULL». Вы могли бы использовать 'X', 'Foo', 0, -1 ...

+0

Я бы использовал SUM-подход, чтобы избежать предупреждения NULL – Madhivanan

+0

SUM (CASE WHEN c.ParentCustomerId NOT NULL THEN 1 ELSE 0 END) «Группа», – Madhivanan

0

OK Этот запрос предполагает, что каждое имя имеет 2 строки так, Ill использовать внутреннее соединение

select t1.[Plan Number],t1.Name, t1.[Monthly Rate],t1.Group,t2.[Direct Debit] from 
(
select p.ProductNumber "Plan Number",p.Name,p.price "Monthly Rate",count(*) "Group", '0' "Direct Debit" 
from contact c,product p 
where c.integ_schemeid = p.ProductId 
and c.ParentCustomerId is not null 
group by p.ProductNumber,p.Name,p.price 
)t1 
inner join 
(
select p.ProductNumber "Plan Number",p.Name,p.price "Monthly Rate", '0' "Group", count(*) "Direct Debit" 
from contact c,product p 
where c.integ_schemeid = p.ProductId 
and c.ParentCustomerId is null 
group by p.ProductNumber,p.Name,p.price) t2 
on t1.[Plan Number] = t2.[Plan Number] and t1.name=t2.name and t1.[Monthly Rate] = t2.[Monthly Rate] 

В этом запросе я использовать ваши же вычисления затем присоединиться к другой таблице вы можете изменить столбец, который хотите отфильтровать, но для группы столбцов я использовал верхний запрос и для столбца прямого дебетования я использовал нижний запрос

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