2013-03-18 2 views
3

Если бы я был более опытным, я бы мог использовать похожие «ряды строк», чтобы понять это, но я не могу заставить их работать. У меня около 2000 «гаражей» в accdb с определенными категориями (на самом деле клиники с данными пациента, но упрощенные здесь). Ниже приведен пример того, как существует данные для одного гаража:SQL Turn 1 поле, несколько записей в 1 запись нескольких полей

Garage ID Car_Color  Sub_Type? Color_Count 
    42  Blue   Striped  5 
    42  Blue       10 
    42  Red       23 
    42  Yellow       2 

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

Garage ID Blue Cars (total) Blue Cars (striped) Red Cars Yellow Cars Orange Cars 
    42   15     5     23   2    0 

Существует одна категория с подтипом, показанная здесь как «Синие автомобили» и «Синие автомобили (полосатые)». Для них мне нужно было бы подсчитать количество «голубого» без подтипа с другим «голубым» счетчиком, чтобы получить общее количество «синих». Затем я перечислил синий подтип как отдельное поле. В большинстве гаражей нет оранжевых автомобилей, поэтому мне нужно будет показать запись 0 для этого поля, когда нет записи оранжевых автомобилей, но отразите счет, если есть запись для него.

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

+0

Загляните в Crosstab. –

ответ

5

Вы можете использовать агрегатную функцию с IIF() выражения:

Если вы делаете это в другой базе данных, что позволяет CASE выражения запроса будет:

select [Garage ID], 
    sum(case 
     when Car_color='Blue' 
     then Color_Count else 0 end) as BlueCarsTotal 
    sum(case 
     when Car_color='Blue' AND [Sub_Type?]='Striped' 
     then Color_Count else 0 end) as BlueCarsStripedTotal, 
    sum(case 
     when Car_color='Red' 
     then Color_Count else 0 end) as RedCarsTotal, 
    sum(case 
     when Car_color='Yellow' 
     then Color_Count else 0 end) as YellowCarsTotal, 
    sum(case 
     when Car_color='Orange' 
     then Color_Count else 0 end) as OrangeCarsTotal 
from yourtable 
group by [Garage ID] 
+0

Вау, я никогда не знал этой функции. Это открывает для меня совершенно новый мир. Я видел некоторые из ваших других ответов, bluefeet, и я чувствую себя привилегированным, чтобы вы ответили на мой вопрос. Он отлично работает для того, что мне нужно. Большое спасибо. Ваш SQL-кунг-фу очень силен. –

+0

@ Joseph, добро пожаловать, я всегда рад помочь !!! – Taryn

3

перекрестными может удовлетворить :

TRANSFORM Sum(Garages.Color_Count) AS SumOfColor_Count 
SELECT Garages.GarageID 
FROM Garages 
GROUP BY Garages.GarageID 
PIVOT [Car_Color] & " " & [sub_type?]; 
+0

Спасибо, Рему. Это хорошо работает и является изящным решением. Решение Bluefeet дало мне немного больше универсальности, и с печатью нулей это стало более полезным для меня в каком-то кодеке представления данных, в который я его поместил. Тем не менее, ваш ответ является для меня образовательным, и я ценю его для будущего использования, которого я обязательно получу от него. –