首页 > 解决方案 > 在 SSRS 中从两个不同 SQL Server 表中的上次购买生成派生表,然后加入第三个表

问题描述

假设我有三个表:

此外,我希望排除某些裤子类型和某些衬衫类型(PANT_TYPE IS NOT 'JEANS',SHIRT_TYPE IS NOT 'TUXEDO'),并且只获取最近购买的裤子和衬衫。

所以,理想情况下,我最终会得到这样的决赛桌:

CUST_ID, LAST_PANT_TYPE, LAST_PANT_DATE, LAST_SHIRT_TYPE, LAST_SHIRT_DATE

在工作了四个小时后,我试图让这个解决方案正常工作,但是“OVER”语句会破坏 SSRS 并导致测试查询出现问题,甚至有时会随机删除字段。所以,我认为某种派生表可能会起作用。

我对 SQL 很陌生,并且在尝试解决这个问题时学到了很多东西,但我需要得到 STAT。

标签: sql-serverreporting-services

解决方案


您可以尝试使用APPLY运算符,例如:

SELECT
    C.CUST_ID
    , PANT.PANT_TYPE LAST_PANT_TYPE
    , PANT.PANT_DATE LAST_PANT_DATE
    , SHIRT.SHIRT_TYPE LAST_SHIRT_TYPE
    , SHIRT.SHIRT_DATE LAST_SHIRT_DATE
FROM
    CUSTOMER C
    OUTER APPLY
    (
        SELECT TOP 1
            P.PANT_TYPE
            , P.PANT_DATE
        FROM PANT P
        WHERE
            P.CUST_ID = C.CUST_ID
            AND P.PANT_TYPE <> 'JEANS'
        ORDER BY P.PANT_DATE DESC
    ) PANT
    OUTER APPLY
    (
        SELECT TOP 1
            S.SHIRT_TYPE
            , S.SHIRT_DATE
        FROM SHIRT S
        WHERE
            S.CUST_ID = C.CUST_ID
            AND S.SHIRT_TYPE <> 'TUXEDO'
        ORDER BY S.SHIRT_DATE DESC
    ) SHIRT

使用OUTER APPLY(而不是CROSS APPLY)确保不会过滤掉任何客户(NULL如果在各自的表中没有客户的数据,将在“PANT”或“SHIRT”列中返回)。


推荐阅读