【发布时间】:2015-04-09 09:38:01
【问题描述】:
我需要逐年比较数据。
我使用的是 Microsoft Access 2013。
我想要得到的是这样的表格:
╔══════╦══════════╦ ... ╦═══════╦═══════════════╦══════════════╦════════════╗
║ Zone ║ Customer ║ ... ║ Month ║ Previous year ║ Current year ║ Difference ║
╠══════╬══════════╬ ... ╬═══════╬═══════════════╬══════════════╬════════════╣
║ PD ║ A ║ ... ║ 1 ║ 100€ ║ 150€ ║ +50€ ║
║ PD ║ B ║ ... ║ 2 ║ 150€ ║ 100€ ║ -50€ ║
║ PD ║ C ║ ... ║ 1 ║ 200€ ║ 0€ ║ -200€ ║
║ PD ║ D ║ ... ║ 2 ║ 0€ ║ 100€ ║ +100€ ║
╚══════╩══════════╩ ... ╩═══════╩═══════════════╩══════════════╩════════════╝
("..." stands for other columns)
确定上一年是2014年,现在是2015年,用这张表我可以看看:
- 一位 2014 年的客户在 2015 年购买了更多(客户 A);
- 一位 2014 年的客户在 2015 年购买了 less(客户 B);
- 一位 2014 年的客户尚未在 2015 年购买(客户 C);
- 有一个 2015 年的新客户(客户 D)。
当我有一个“老”(2014 年)客户在 2015 年没有购买时我需要在当前年份列(2015 年)中看到具有“0€”值的行,等等对于 2015 年的新客户,显然 2014 年没有购买任何东西也是如此。
这些是我的桌子:
- 客户(id、company_name、id_zone、id_customer_category)
- CUSTOMER_CATEGORIES(ID、描述)
- 订单(id、id_customer、日期、数量、金额 (€)、id_product_category、 id_import)
- PRODUCT_CATEGORIES(ID、供应商、描述)
- ZONES(ID,城市)
- 进口(ID、年、月、供应商)
我创建了一个视图 (V_YEAR_SALES):
SELECT Z.ID AS ID_ZONE, Z.CITY, C.COMPANY_NAME AS CUSTOMER, CAT.DESCRIPTION AS CUSTOMER_CATEGORY, P.SUPPLIER, P.DESCRIPTION AS PRODUCT_CATEGORY, I.MONTH, I.YEAR, SUM(O.AMOUNT) AS AMOUNT
FROM ((((ORDERS AS O
INNER JOIN CUSTOMERS AS C ON O.ID_CUSTOMER = C.ID)
INNER JOIN ZONES AS Z ON Z.ID = C.ID_ZONE)
INNER JOIN IMPORTS AS I ON I.ID = O.ID_IMPORT)
INNER JOIN CUSTOMER_CATEGORIES AS CAT ON CAT.ID = C.ID_CUSTOMER_CATEGORY)
INNER JOIN PRODUCT_CATEGORIES AS P ON O.ID_PRODUCT_CATEGORY = P.ID
GROUP BY Z.ID, Z.CITY, C.COMPANY_NAME, CAT.DESCRIPTION, P.SUPPLIER, P.DESCRIPTION, I.MONTH, I.YEAR
ORDER BY Z.CITY, P.SUPPLIER, P.DESCRIPTION, CAT.DESCRIPTION, C.COMPANY_NAME, I.YEAR, I.MONTH;
每当我需要对一年和上一年进行比较时,我都会使用这个视图 (V_SALES_COMPARISON) 来过年:
SELECT S1.ID_ZONE, S1.CITY, S1.ID_CUSTOMER, S1.CUSTOMER, S1.ID_CUSTOMER_CATEGORY, S1.CUSTOMER_CATEGORY, S1.SUPPLIER, S1.ID_PRODUCT_CATEGORY, S1.PRODUCT_CATEGORY, S1.YEAR, S1.MONTH, S1.AMOUNT AS CURRENT_YEAR, S2.AMOUNT AS PREVIOUS_YEAR, S1.AMOUNT - S2.AMOUNT AS DIFFERENCE
FROM
(SELECT * FROM V_YEAR_SALES) AS S1
LEFT JOIN
(SELECT * FROM V_YEAR_SALES) AS S2
ON (S1.ID_ZONE = S2.ID_ZONE)
AND (S1.SUPPLIER = S2.SUPPLIER)
AND (S1.ID_PRODUCT_CATEGORY = S2.ID_PRODUCT_CATEGORY)
AND (S1.ID_CUSTOMER_CATEGORY = S2.ID_CUSTOMER_CATEGORY)
AND (S1.ID_CUSTOMER = S2.ID_CUSTOMER)
AND (S1.YEAR = S2.YEAR + 1)
AND (S1.MONTH = S2.MONTH);
参考上面的期望结果表,通过这个视图我只能获得客户A、B、D的行而不是C!
我需要包括那些尚未在 2015 年购买的 2014 年客户!
我正在使用 JOIN,但我不知道这是否是最好的方法。也许我可以使用 PIVOTING,但我不知道是否以及如何使用 Access 实现。
【问题讨论】:
-
我觉得是因为这条线:
AND (S1.YEAR = S2.YEAR + 1).. 也试试OR (S1.YEAR = S2.YEAR)..?这只是在黑暗中拍摄 -
@Invent-Animate:不,那样我只能为每个年/月/订单获得许多重复的行:[PREVIOUS_YEAR] = 100 欧元(左右),[CURRENT_YEAR] = 100 欧元(左右),[差异] = 0€。
标签: sql ms-access parameters comparison pivot