2013-03-17 5 views
0

У меня есть две таблицы.Ошибка группировки SQL Server

  1. Customer ID, NAME, MonthlyIncome
  2. Orders ID, CustomerKey, TotalCost

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

CustomerKey, MonthlyIncome, TotalCost. 

Я попытался группе CustomerKey, но я не в состоянии включить остальные столбцы. Какой запрос я должен использовать?

SELECT 
    fs.CustomerKey, SUM(fs.TotalCost) as TotalBought 
FROM 
    FactOnlineSales fs 
INNER JOIN 
    DimCustomer c on c.CustomerKey = fs.CustomerKey 
GROUP BY 
    fs.CustomerKey 
+0

Просто включите и добавьте дополнительные столбцы ... –

+0

Спасибо. Но включая эти дополнительные столбцы не сломает запрос? –

ответ

1

Я попытался группе CustomerKey, но не в состоянии управлять, как включить остальные столбцы.

Just do it:

SELECT fs.CustomerKey, 
     c.MonthlyIncome, 
     SUM(fs.TotalCost) as TotalBought 
    FROM FactOnlineSales fs 
     INNER JOIN DimCustomer c 
     ON c.CustomerKey = fs.CustomerKey 
GROUP BY fs.CustomerKey, 
      c.MonthlyIncome 

Предположительно CustomerKey уникален, поэтому группировка по менее уникального столбца не собирается менять SUM всего.

1

Вы не упомянули, что версия из SQL Server, который вы используете, - но если вы на SQL Server 2005 или более поздней версии, вы можете использовать OVER() пункт:

SELECT 
    fs.CustomerKey, 
    c.MonthlyIncome, 
    TotalBought = SUM(fs.TotalCost) OVER(PARTITION BY fs.CustomerKey) 
FROM 
    FactOnlineSales fs 
INNER JOIN 
    DimCustomer c on c.CustomerKey = fs.CustomerKey 

Это в основном дает вам CustomerKey, MonthlyIncome, а затем суммирует TotalCost для каждого CustomerKey и отображает соответствующее значение на вашем выходе. Нет необходимости делать GROUP BY в этом случае

1

Возможно, у вас может быть ошибка в предложении ON соединения.
Вы использовали CustomerKey вместо Customer ID из таблицы DimCustomer. Для gouping: вы должны группироваться по каждому столбцу, на котором вы не собираете, поэтому вы можете включить NAME (так что вы можете иметь описательного клиента) и MonthlyIncome.

SELECT 
    c."Customer ID", 
    c.NAME, 
    c.MonthlyIncome, 
    SUM(fs.TotalCost) as TotalBought 
FROM 
    FactOnlineSales fs INNER JOIN DimCustomer c 
    on c."Customer ID" = fs.CustomerKey 
GROUP BY 
    c."Customer ID", 
    c.NAME, 
    c.MonthlyIncome 
Смежные вопросы