2015-07-24 2 views
0

я вывод В следующей таблицеSQL-Агрегирование над группами в пределах Colum

CustomerID | OrderType | Date 
============================= 
1   | A   | 1/1 
1   | B   | 2/1 
1   | A   | 3/1 
2   | A   | 1/1 
2   | A   | 4/1 
.... 

из таблицы, содержащей дополнительный ID-столбец, используя группировку с помощью CustomerID и OrderType.

При получении этой таблички меня поразило, что мне также нужно выбрать столбец «Дата». В противном случае пара каждого клиентаID-Ordertype возникает только один раз (например, без этой колонки 3-я строка будет отсутствовать.)

На следующем шаге я хотел бы подсчитать количество Ordertype для каждого клиента. Я могу сделать это в R (это легко сделать с помощью dplyr). Однако, так как файл достаточно большой (и память является проблемой в студии управления SQL MS), я бы предпочел, чтобы получить непосредственно таблицу следующей формы

Customer ID | Count(Type_A) | Count(Type_B) 
=========================================== 
1   | 2    | 1 
2   | 2    | 0 
.... 

Как я уже сказал, это легкая задача с R. Можно ли это также получить с помощью SQL? Я считаю, что реализация может потребовать некоторых самостоятельных подключений, но пока я не смог решить эту проблему.

Любые подсказки?

ответ

3

Это несколько путей, чтобы достичь этого.

Простой пример (вы можете использовать либо рассчитывать или суммировать следующим образом):

select 
    CustomerID, 
    COUNT(case when OrderType = 'A' then 1 end) [COUNT(Type_A)], 
    COUNT(case when OrderType = 'B' then 1 end) [COUNT(Type_B)] 
from myTable 
group by 
    CustomerID 
+0

вы должны также иметь в ' группа '' ordertype'? –

+0

@vkp. , , Точно нет. –

+0

Не нужно группировать по порядку. это поле, в котором вы применяете агрегацию. – mxix

2

Для тех, кто заинтересован в манипулировании кадры данных с помощью SQL внутри R, они могут использовать функцию sqldf передать запрос, mxix написал в виде строки:

df <- read.table(text ="CustomerID OrderType Date 
         1   A   1/1 
         1   B   2/1 
         1   A   3/1 
         2   A   1/1 
         2   A   4/1", 
       header =TRUE) 
library(sqldf) 
sqldf("select 
    CustomerID, 
    COUNT(case when OrderType = 'A' then 1 end) [COUNT(Type_A)], 
    COUNT(case when OrderType = 'B' then 1 end) [COUNT(Type_B)] 
from df 
group by 
    CustomerID") 

Выход:

CustomerID COUNT(Type_A) COUNT(Type_B) 
1   1    2    1 
2   2    2    0 
Смежные вопросы