SQL Pivot вопрос - PullRequest
       10

SQL Pivot вопрос

2 голосов
/ 05 января 2010

Мне трудно разобраться с запросом, который я пытаюсь построить с помощью SQL Server 2005.

У меня есть таблица, давайте назовем ее продажи:

SaleId (int) (pk) EmployeeId (int) SaleDate (datetime)

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

Так, например, я хочу видеть все продажи с 1 декабря 2009 г. по 31 декабря 2009 г. с выводом типа:

EmployeeId  Dec1   Dec2 Dec3   Dec4

1            10    10    1     20
2            25    10    2      2

.. и т. Д., Однако даты должны быть гибкими.

Я возился с использованием pivot, но, похоже, не могу его получить, любые идеи приветствуются!

Ответы [ 2 ]

4 голосов
/ 05 января 2010

Вот полный пример. Вы можете изменить диапазон дат в соответствии со своими потребностями.

use sandbox;
create table sales (SaleId int primary key, EmployeeId int, SaleAmt float, SaleDate date);

insert into sales values (1,1,10,'2009-12-1');
insert into sales values (2,1,10,'2009-12-2');
insert into sales values (3,1,1,'2009-12-3');
insert into sales values (4,1,20,'2009-12-4');

insert into sales values (5,2,25,'2009-12-1');
insert into sales values (6,2,10,'2009-12-2');
insert into sales values (7,2,2,'2009-12-3');
insert into sales values (8,2,2,'2009-12-4');

SELECT * FROM
      (SELECT EmployeeID, DATEPART(d, SaleDate) SaleDay, SaleAmt
                  FROM sales
                  WHERE SaleDate between '20091201' and '20091204'
                  ) src
PIVOT (SUM(SaleAmt) FOR SaleDay
IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])) AS pvt;

Результаты (на самом деле будут перечислены 31 столбец (для всех возможных дней месяца), но я просто показываю первые 4):

EmployeeID      1       2       3       4
1               10      10      1       20
2               25      10      2       2
1 голос
/ 05 января 2010

Я немного повозился, и я думаю, что вот как вы можете сделать это с PIVOT:

select  employeeid
,       [2009/12/01] as Dec1
,       [2009/12/02] as Dec2
,       [2009/12/03] as Dec3
,       [2009/12/04] as Dec4
from    sales pivot (
        count(saleid) 
        for saledate
        in ([2009/12/01],[2009/12/02],[2009/12/03],[2009/12/04])
    ) as pvt

(это мой стол:

CREATE TABLE [dbo].[sales](
[saleid] [int] NULL,
[employeeid] [int] NULL,
[saledate] [date] NULL

данные: 10 строк для «2009/12/01» для emp1, 25 строк для «2009/12/01» для emp2, 10 строк для «2009/12/02» для emp1 и т. Д.)

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

РЕДАКТИРОВАТЬ: ОК-ОКП ответ делает это. Хитрость в том, что вам не нужно явно называть столбцы в списке SELECT, * будет действительно правильно расширяться до столбца для первого столбца «не развернутого» и динамически генерируемого столбца для каждого значения, которое появляется в FOR .. Предложение IN в конструкции PIVOT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...