2013-10-25 2 views
0

У меня есть 2 стола «Заказы» и «Клиенты».Запрос Sql для получения общих заказов (счетов) по типу клиента

Я хочу подсчитать количество заказов в зависимости от типа клиента в каждом месяце, в неделю и в каждом.

В таблице заказов указаны порядковые и клиентские поля.

Таблица клиентов имеет поле CustomerID и CustomerTypeID.

Я попытался ниже запроса: -

SELECT 
       "Month" = month(o.OrderDate) 
       , "Year" = year(o.OrderDate) 
       , NoOfCustomer = Count(o.Total)      
      FROM 
       Orders o   
       INNER JOIN 
       Customers C on C.CustomerID = o.CustomerID       
      WHERE 
       o.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') 
       AND o.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') 
      GROUP BY 
       month(o.OrderDate) 
       , year(o.OrderDate) 

      ORDER BY 
       year(o.OrderDate) 
       , month(o.OrderDate) 

Я хочу привести кое-что, как показано ниже: -

Month Year NoOfCustomer CustomerType 
1  2013 45625   1 
2  2013 12131   2 
3  2013 54544   3 
4  2013 7888   4 
1  2013 5652   1 
2  2013 5655   2 
3  2013 5522   3 
4  2013 555   4 

Спасибо заранее.

+0

Какого результата вы получаете с этим запросом – Armand

+0

от того, что я вижу, что вы должны добавить тип клиента в группу по статье тоже – Raphael

ответ

0

Я нашел решение, Спасибо всем за вашу помощь и время: -

SELECT 2013 as [Year], 
     months.number, 
     Amount = SUM(COALESCE(o.Total,0)), 
     C.CustomerTypeID 
FROM Customers C 
CROSS JOIN 
(SELECT number FROM master..spt_values WHERE type='p' and number between 1 and 12) months 
LEFT JOIN [Orders] o on C.CustomerId = o.CustomerId and YEAR(o.OrderDate) = 2013 and MONTH(o.OrderDate) = months.number 
GROUP BY months.number, C.CustomerTypeID 
ORDER BY months.number, C.CustomerTypeID 
0

Может быть, это поможет

DECLARE @DateStart DATETIME, @DateEnd DATETIME; 
    SET @DateStart = CONVERT(DATETIME, '1/1/2013 12:00:00 AM'); 
    SET @DateEnd = CONVERT(DATETIME, '12/31/2013 12:00:00 AM'); 

    SELECT 
    MONTH(o.OrderDate) [Month] 
    , YEAR(o.OrderDate) [Year] 
    , ISNULL(C.CustomerType,0) [CustomerType] 
    , COUNT(o.Total) [NoOfCustomer]     
    FROM Orders o   
    LEFT OUTER JOIN Customers C on C.CustomerID = o.CustomerID       
    WHERE o.OrderDate BETWEEN @DateStart AND @DateEnd 
    GROUP BY MONTH(o.OrderDate), YEAR(o.OrderDate), ISNULL(C.CustomerType,0) 
    ORDER BY [Year],[Month],[CustomerType]; 

UPDATE

DECLARE @DateStart DATETIME, @DateEnd DATETIME; 
    DECLARE @CustTypeTable TABLE(CustomerType INT); 
    DECLARE @i INT = 0; 
    /*Create table variable for customer types*/ 
    WHILE @i < 5 
    BEGIN 
     INSERT INTO @CustTypeTable 
     SELECT @i 
     SET @i = @i + 1 
    END 

    /*The statement will force all CustomerTypes with a "fake" table*/ 
    DECLARE @StagingTable TABLE([Month] INT, [Year] INT, CustomerType INT) 
    INSERT INTO @StagingTable 
    SELECT 
    MONTH(o.OrderDate) [Month] 
    , YEAR(o.OrderDate) [Year] 
    , T.CustomerType 
    FROM Orders o 
    CROSS JOIN @CustTypeTable T 
    GROUP BY MONTH(o.OrderDate), YEAR(o.OrderDate), T.CustomerType 


    SET @DateStart = CONVERT(DATETIME, '1/1/2013 12:00:00 AM'); 
    SET @DateEnd = CONVERT(DATETIME, '12/31/2013 12:00:00 AM'); 

    /*Create another staging table for results*/ 
    DECLARE @StagingTable2 TABLE([Month] INT, [Year] INT, CustomerType INT, [NoOfCustomer] BIGINT) 
    INSERT INTO @StagingTable2 
    SELECT 
    MONTH(o.OrderDate) [Month] 
    , YEAR(o.OrderDate) [Year] 
    , C.CustomerType [CustomerType] 
    , COUNT(o.Total) [NoOfCustomer]     
    FROM Orders o   
    LEFT OUTER JOIN Customers C on C.CustomerID = o.CustomerID       
    WHERE o.OrderDate BETWEEN @DateStart AND @DateEnd 
    GROUP BY MONTH(o.OrderDate), YEAR(o.OrderDate), C.CustomerType 
    ORDER BY [Year],[Month],[CustomerType]; 

    /*Now lets join them up*/ 
    SELECT 
    T1.Year 
    , T1.Month 
    , T1.CustomerType 
    , T2.[NoOfCustomer] 
    FROM @StagingTable T1 
    LEFT OUTER JOIN @StagingTable2 T2 ON T2.Year = T1.Year AND T2.Month = T1.Month AND T2.CustomerType = T1.CustomerType 

Thats примерно столько же, сколько я могу сделать для вас

+0

Благодаря @Adrian, это очень близко. http://www.evernote.com/shard/s364/sh/81461f09-38b2-42d4-bdec-c3017d4a1672/944ff1f6e7f6915344ff0fdebae2b2d4, customertype 4 не имеет значения за месяц 4, можем ли мы показать 0 по умолчанию для него? – AnandMeena

+0

изменен JOIN и добавлен ISNULL –

+0

забыл изменить GROUP, чтобы включить ISNULL, теперь должен работать –

2

Попробуйте это:

SELECT MONTH(o.OrderDate) as MonthValue, 
     YEAR(o.OrderDate) as YearValue, 
     C.CustomerType, Count(o.Total) as NoOfOrders 
FROM Orders o   
INNER JOIN Customers C on C.CustomerID = o.CustomerID       
WHERE o.OrderDate >= CONVERT(DATETIME, '1/1/2013 00:00:00 AM') 
AND o.OrderDate <= CONVERT(DATETIME, '12/31/2013 23:59:59 PM') 
GROUP BY MONTH(o.OrderDate), 
     YEAR(o.OrderDate), 
     C.CustomerType 
ORDER BY MONTH(o.OrderDate), 
     YEAR(o.OrderDate) 

UP ДАТА:

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

; with CTE AS 
(
     SELECT MONTH(CAST('01/01/2013' AS DateTime)) [Month], 2013 [Year], CustomerType, 0 NoOfCustomers 
     FROM Customers 
     UNION ALL 
     SELECT [MONTH] + 1, 2013 [Year], CustomerType, 0 NoOfCustomers 
     FROM CTE 
     WHERE [Month] <= 12 
     AND CustomerType NOT IN 
     (
      SELECT C.CustomerType 
      FROM [Orders] O INNER JOIN Customers C ON C.CustomerID = o.CustomerID  
      WHERE MONTH(O.OrderDate) = CTE.[Month] AND YEAR(O.OrderDate) = 2013 
     ) 
) 

SELECT * FROM 
(
    SELECT DISTINCT [Month], [Year], CustomerType, NoOfCustomers FROM CTE 
    UNION 
    SELECT MONTH(o.OrderDate) as [Month], 
      2013 as [Year], 
      C.CustomerType, 
      COUNT(o.Total) as NoOfCustomers 
    FROM [Orders] o   
    INNER JOIN Customers C on C.CustomerID = o.CustomerID 
    WHERE YEAR(o.OrderDate) = 2013 
    GROUP BY MONTH(o.OrderDate), C.CustomerType 
    ) tt 
ORDER BY [Month], [Year], CustomerType 
+0

Спасибо @Upendra, но он дает ошибку «Неправильный синтаксис рядом с ключевым словом« ORDER ».« – AnandMeena

+0

Извините, одна запятая была там, у меня есть обновленный ответ, попробуйте сейчас. Также я изменил дату и время, чтобы сравнить, как вы пропустили записи после 12 часов дня 31 декабря и до 12 часов дня 1 января. –

+0

спасибо @Upendra, он работает отлично, просто еще одно требование. см. http://www.evernote.com/shard/s364/sh/a4f44f1c-2f0a-4ace-9005-a1af205d298c/e14d43ed26f9886378cbdacf5789ec99, customertype 4 не имеет значения за месяц 4, можем ли мы показать 0 по умолчанию? – AnandMeena

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