Как написать сводную таблицу для отображения записей за каждый год в виде столбцов? - PullRequest
1 голос
/ 19 декабря 2011

Я почти уверен, что для этого мне нужен шарнир, но я не могу этого понять. (sql newb)

У меня есть такие данные:

ID    CompanyID    Year    Revenue    Expenses
1     0003         2011    12000      4000
2     0003         2010    9000       6000
3     0003         2009    7000       9000
4     0010         2011    134300     34000
5     0010         2010    43000      46000
6     0010         2009    73000      39000

Могу ли я использовать Pivot для отображения этой таблицы следующим образом:

CompanyID    2011-Revenue    2010-Revenue    2009-Revenue    2011-Expenses   2010-Expenses    2009-Expenses
0003         12000           9000            7000            4000            6000             9000
0010         134300          43000           73000           34000           46000            39000

Вот что у меня есть ...

* * 1010

Что возвращается:

CompanyID    2011-Revenue    2010-Revenue 
0003         12000           NULL
0003         NULL            9000

Мало проблем с моими результатами ...

  1. Для CompanyID 0003 есть две записи, которые я хочу сгруппировать в одну запись

  2. Я могу выбрать только одну компанию за раз, мне нужно выбрать несколько. Я пытался

    FROM tblRecords P
    WHERE P.[CompanyID] IN (@CompanyIDs)
    GROUP BY CompanyID, [Year], [Revenue]) AS P1
    

    Где @CompanyIDs - строка, подобная '0003, 0010' - Она не завершилась ошибкой, но в результате получилась просто пустая таблица с заголовками и без данных.

Любая помощь будет признательна .. или дайте мне знать, если я неправильно понимаю стержень?

Большое спасибо!

Thomas

РЕДАКТИРОВАТЬ: Использование Microsoft SQL Server Management Studio 2005 Express

ОБНОВЛЕНИЕ 2: я выяснил, как объединить таблицы для получения более подробной информации, однако мне все еще нужно иметь возможность передавать идентификаторы компаний в виде строки с разделителями-запятыми ... любая помощь по этому вопросу будет приветствоваться.

vvvvvvvv Я выяснил, НИЖЕ ЭТОГО (опубликую, как только все заработает) vvvvvvv

ОБНОВЛЕНИЕ: похоже, что предложенное Рубеном будет работать, однако я только что определил, что мне нужно немного больше функциональности для этого ... Могу ли я объединить это с другой таблицей, чтобы иметь заголовки

  CompanyID    CompanyName    CompanyAddress    2011-Revenue    2010-Revenue 

Где CompanyName и CompanyAddress взяты из другой таблицы (tblCompanyDetails)

Я пытался использовать:

SELECT *
FROM 
(
    SELECT  CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Revenue' Type,
            Revenue Value FROM tblRecords
    FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
    UNION ALL
    SELECT  CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Expenses' Type,
            Expenses  Value FROM tblRecords 
    FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
) src
    PIVOT
(
    SUM(Value) for [Type] in
([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
     [2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
)
) pvt
WHERE CompanyID = @CompanyID

Я получаю ошибку:

Msg 1038, Level 15, State 4, Procedure spCompare, Line 10
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name. 

1 Ответ

2 голосов
/ 19 декабря 2011

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

DECLARE @CompanyIDs XML
DECLARE @Records  TABLE
(
    ID int,
    CompanyID char(4),
    Year int,
    Revenue decimal,
    Expenses decimal
)
DECLARE @CompanyDetails TABLE
(
    CompanyID char(4),
    Name varchar(50),
    Address varchar(50)
)

SET @CompanyIDs = '
<filter>
    <CompanyID>0003</CompanyID>
    <CompanyID>0010</CompanyID>
</filter>'

INSERT INTO @Records 
(ID, CompanyID, Year, Revenue, Expenses)VALUES 
(1, '0003', 2011, 12000 , 4000 ),
(2, '0003', 2010, 9000  , 6000 ),
(3, '0003', 2009, 7000  , 9000 ),
(4, '0010', 2011, 134300, 34000),
(5, '0010', 2010, 43000 , 46000),
(6, '0010', 2009, 73000 , 39000)

INSERT INTO @CompanyDetails 
(CompanyID, Name, Address) VALUES
('0003', 'Company A', 'A Street'),
('0010', 'Company B', 'B Street')

SELECT *
FROM 
(
    SELECT  CompanyID, CAST(YEAR AS varchar) + ' - Revenue' Type,
            Revenue Value FROM @Records 
    UNION ALL
    SELECT  CompanyID, CAST(YEAR AS varchar) + ' - Expenses' Type,
            Expenses  Value FROM @Records 
) src
PIVOT
(
    SUM(Value) for [Type] in
    ([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
     [2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
    )
) pvt
JOIN    @CompanyDetails Details
    ON  Details.CompanyId = pvt.CompanyID
WHERE   pvt.CompanyID IN
(
    SELECT  T.C.value('.', 'char(4)')
    FROM    @CompanyIDs.nodes('/filter/CompanyID') T(C)
)

Вам необходимо отправить фильтр вашей компании в виде XML и использовать этот подвыбор, чтобы разбить ваши данные, как это требуется для сводных операций. Для операций JOIN просто используйте pvt output

...