2017-02-08 4 views
0

В приведенном ниже коде перечислены номера счетов по коду магазина, к которому они принадлежат, и помещается ярлык рядом с учетной записью, такой как «Истек», «Активный» или «Старый». Я хотел бы иметь возможность создать сводку по каждому коду магазина, который показывает, сколько из каждого типа учетной записи у них есть, например shop_thames = 1 old, 4 active и 10 expired. Как я могу это достичь?Агрегирование ярлыков строк

SELECT 
shop_code, 
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type, 
account_id, 
SUM(Revenue) AS Spend 

FROM 
[company].[dbo].name 

WHERE 
Date_Reporting_LY = '2016' 
AND Total_Revenue > 0 

GROUP BY 
shop_code, 
account_id 
+0

sql-server-2012 – 80gm2

ответ

0

Что-то вроде этого следует сделать это:

select shop_code, account_type, count(*) 
    from (SELECT shop_code, 
       CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type 
      FROM [company].[dbo].name  
     WHERE Date_Reporting_LY = '2016' 
      AND Total_Revenue > 0) x 
GROUP BY shop_code, Account_Type 
+0

Я пробовал это, и он просто дает мне 1 значение в столбце результатов. Затем я попытался сделать несколько SUM (CASE Statement in external select, чтобы увидеть, будет ли это работать, но я получаю только 0 или 1. Я думаю, что это потому, что он смотрит против кода магазина, а не на добавление значений account_id. – 80gm2

+0

Попробуйте заменить shop_code на account_id, а затем – MikeS

+0

Поскольку он не будет агрегировать в общей сложности каждый тип учетной записи по коду магазина. – 80gm2

0

свой запрос в основном, как есть, и завернуть его в другой выберите:

SELECT shop_code, account_type, count(*) 
FROM (
SELECT 
shop_code, 
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type, 
account_id, 
SUM(Revenue) AS Spend 

FROM 
[company].[dbo].name 

WHERE 
Date_Reporting_LY = '2016' 
AND Total_Revenue > 0 

GROUP BY 
shop_code, 
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END 
account_id 
) x 
GROUP BY 
shop_code, 
account_type 

Одно изменение в исходном запросе - MySQL не настаивает на том, что вы группируете все элементы в выборе вне агрегатных функций, но это действительно лучшая практика. Если вы группируете по всему оператору case, как показано, вы избегаете проблем с агрегированием по значениям, которые вы не видите.

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

  • Нет связанных вопросов^_^