2010-04-16 2 views
1

У меня есть таблица с именем, «Sales», имеющим следующие столбцы:SQL команды для следующей таблицы

Sales_ID|Product_Code|Zone|District|State|Distributor|Total_Sales 

Теперь я хочу, чтобы генерировать итоги продаж, чтобы просмотреть общие объем продаж от зоны, а затем по районам и затем государством, через которое распространитель за последний/последний месяц.

Как я могу написать заявление Sql для этого? Может ли кто-нибудь мне помочь? Заранее спасибо.

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

ответ

3

Посмотрите на использование опции ROLLUP GROUP BY.

Generates the simple GROUP BY aggregate rows, plus subtotal or super-aggregate rows, 
and also a grand total row. 

The number of groupings that is returned equals the number of expressions 
in the <composite element list> plus one. For example, consider the following statement. 

    Copy Code 
    SELECT a, b, c, SUM (<expression>) 
    FROM T 
    GROUP BY ROLLUP (a,b,c) 

One row with a subtotal is generated for each unique combination of values of 
(a, b, c), (a, b), and (a). A grand total row is also calculated. 

Columns are rolled up from right to left. 
The column order affects the output groupings of ROLLUP and can affect the number 
of rows in the result set. 

Что-то вроде

DECLARE @Table TABLE(
     Zone VARCHAR(10), 
     District VARCHAR(10), 
     State VARCHAR(10), 
     Sales FLOAT 
) 

INSERT INTO @Table SELECT 'A','A','A',1 
INSERT INTO @Table SELECT 'A','A','B',1 
INSERT INTO @Table SELECT 'A','B','A',1 
INSERT INTO @Table SELECT 'B','A','A',1 

SELECT Zone, 
     District, 
     State, 
     SUM(Sales) 
FROM @Table 
WHERE <Your Condition here> --THIS IS WHERE YOU USE THE WHERE CLAUSE 
GROUP BY ROLLUP (Zone,District,State) 

Получить второе и 3-й largets, вы можете использовать либо (ROW_NUMBER (Transact-SQL))

;WITH Vals AS (
     SELECT *, 
       ROW_NUMBER() OVER (ORDER BY RequiredCol DESC) RowNum 
     FROM YourTable 
) 
SELECT * 
FROM Vals 
WHERE RowNum IN (2,3) 

или

SELECT TOP 2 
     * 
FROM (
      SELECT TOP 3 
        * 
      FROM YourTable 
      ORDER BY RequiredCol DESC 
     ) sub 
ORDER BY RequiredCol 
+0

, что я хочу сделать, это получить сначала информацию по уровню зоны, чем по уровню уровня Districyt, чем на уровне штата следующим дистрибьютором за последний месяц ... Что-то не хватает в вашем запросе ... – Sanju

+1

Мне нужно проверить в прошлом месяце или в прошлом месяце .... и можете ли вы мне помочь в отношении второго вопроса? – Sanju

+0

Если у вас есть столбец даты в вашей таблице, вы должны использовать это в предложении where для выбора только данных за последний месяц. * WHERE DateCol BETWEEN @ Date1 AND @ Date2 * –

0
SELECT SUM(Total_Sales) FROM sales GROUP BY (X) 

Заменить X с Zone, District, State или Distributor.

+0

то, что я хочу сделать, это для получения резюме сначала по Zone le vel, чем на уровне уровня Districyt, чем на государственном уровне следующим дистрибьютором за последний месяц ... Что-то не хватает в вашем запросе ... – Sanju

+2

А как насчет второго вопроса, можете ли вы рассказать об этом также .... – Sanju

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