2016-12-27 10 views
-1

я следующая таблица в моей базе данных SQL Server:Оптимизированный запрос для базы данных SQL Server

| ID | Class            | CId | PId 
| 7865 | Add Class for Prop        | 1043 | 1 
| 82 | Advanced Carpet Spotting Advanced Carpet Spotting | 1043 | 1 
| 82 | Advanced Carpet Spotting Advanced Carpet Spotting | 1042 | 1 
| 7863 | aTesting           | 1042 | 0 
| 7218 | aUnique           | 1042 | 0 
| 85 | Body Mechanics         | 1042 | 1 
| 88 | Carpet Bonnet Cleaning       | 1044 | 0 
| 89 | Carpet Shampooing/Extraction      | 1044 | 1 
| 7829 | Class 10           | 1044 | 0 

У меня есть несколько CId и PId

Если отчетливый CId имеют соответствующие им PId = 1 Затем

Set CId = 1 Otherwise 0 

Я хочу выход как этот

| CId | Status | Count 
| 1042 | 0 | 4 
| 1043 | 1 | 2 
| 1044 | 0 | 3 

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

Пожалуйста, предложите решение. Спасибо.

+1

Пожалуйста, проверьте ваш вопрос: (1) Вы сбрасываете значение 'CId' (не уверен, что это было ваше намерение), (2) Откуда« Статус »? Также представьте свое текущее решение и объясните, в чем проблема с ним. – FDavidov

ответ

0
select cid, 
     case when count(case when pid = 1 then 1 end) > 0 
      then 1 
      else 0 
     end as status, 
     count(*) as count 
from your_table 
group by cid 
0

PId Если всегда 1 и 0, вы можете сделать следующее.

SELECT 
    CID, 
    AVG([Status] * 1) AS [Status], 
    COUNT(*) AS [Count] 
FROM 
    YourTable 
GROUP BY 
    CID 
0

Используйте выражение CASE, чтобы проверить, является ли сумма Pid равна кол-ФИД.

Запрос

select [CId], 
case when sum([Cid]) = count([CId]) then 1 
else 0 end as [Status], 
count([CId]) as [Count] 
from [your_table_name] 
group by [CId]; 

PId Также должны иметь только 1 и 0 значения.

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