Используйте сводную таблицу для отображения количества добавленных и удаленных «инвентаря» - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть набор информации, хранящейся во внешней базе данных, похожий на следующий формат:

Таблица 1

Date, InventoryID, InventoryValue
1-12-2011, 1111-111A, 60
2-12-2011, 1111-111B, 50
3-12-2011, 1111-111C, 30

1-1-2012, 1111-111B, 40
2-1-2012, 1111-111C, 40
3-1-2012, 1111-111D, 40

И мне нужно представить приведенные выше результаты в следующем формате в сводной таблице:

Таблица 2

Month, Beg Inventory, Added, Removed, Ending Inventory
Jan, 3, 1, 1, 3

Из таблицы 1 видно, что 1 предмет был добавлен из инвентаря за декабрь 11 года в инвентарь за январь 12 года (1111-111D), а один предмет удален (1111-111A), в результате чего результаты в таблице 2.

Когда я дважды щелкаю на «Добавленном» или «Удаленном» инвентаре, я могу видеть, к какому InventoryID они принадлежат. Таблица также должна отражать «добавлено» и «удалено» за последние 12 месяцев.

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

1 Ответ

2 голосов
/ 07 февраля 2012

Решение (чистый SQL):

SELECT right(convert(varchar, tbl.[Date], 106), 8) [Date],
(SELECT COUNT(*) FROM [Table1] t1 WHERE month(t1.[Date]) = (tbl.m - 1) AND year(t1.[Date])=tbl.y) [Begin],
(SELECT COUNT(*)
    FROM Table1 t1
    WHERE month(t1.[Date]) = tbl.m
    AND year(t1.[Date])=tbl.y
    AND t1.InventoryID NOT IN (
        SELECT InventoryID
        FROM Table1
        WHERE month(t1.[Date]) = month(DATEADD(month, 1, [Date])) AND year(t1.[Date]) = year([Date]))) [Added],
(SELECT COUNT(*)
    FROM Table1 t1
    WHERE month(t1.[Date]) = (tbl.m - 1)
    AND year(t1.[Date])=tbl.y
    AND t1.InventoryID NOT IN (
        SELECT InventoryID
        FROM Table1
        WHERE month([Date]) = month(DATEADD(month, 1, t1.[Date])) AND year(t1.[Date]) = year([Date]))) [Removed],
(SELECT COUNT(*) FROM [Table1] t1 WHERE month(t1.[Date]) = (tbl.m) AND year(t1.[Date])=tbl.y) [End]
FROM (SELECT DISTINCT [Date], month([Date]) [m], year([Date]) [y] from Table1) as tbl

Воспроизведение:

Пример сценария данных:

SELECT * INTO Table1 FROM (
    SELECT GETDATE() [Date], '1111-111A' [InventoryID], 60 [InventoryValue] UNION
    SELECT GETDATE() [Date], '1111-111B' [InventoryID], 50 [InventoryValue] UNION
    SELECT GETDATE() [Date], '1111-111C' [InventoryID], 30 [InventoryValue] UNION

    SELECT DATEADD(month, 1, GETDATE()) [Date], '1111-111B' [InventoryID], 40 [InventoryValue] UNION
    SELECT DATEADD(month, 1, GETDATE()) [Date], '1111-111C' [InventoryID], 40 [InventoryValue] UNION
    SELECT DATEADD(month, 1, GETDATE()) [Date], '1111-111D' [InventoryID], 40 [InventoryValue] UNION

    SELECT DATEADD(month, 2, GETDATE()) [Date], '1111-111B' [InventoryID], 40 [InventoryValue] UNION
    SELECT DATEADD(month, 2, GETDATE()) [Date], '1111-111C' [InventoryID], 40 [InventoryValue] UNION
    SELECT DATEADD(month, 2, GETDATE()) [Date], '1111-111D' [InventoryID], 40 [InventoryValue] UNION
    SELECT DATEADD(month, 2, GETDATE()) [Date], '1111-111F' [InventoryID], 40 [InventoryValue]) as tbl

Вывод:

Date        Begin   Added   Removed End
---------------------------------------
Feb 2012    0       3       0       3
Mar 2012    3       1       1       3
Apr 2012    3       1       0       4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...