sql-server - 在 SSRS 中从两个不同 SQL Server 表中的上次购买生成派生表,然后加入第三个表
问题描述
假设我有三个表:
- 具有唯一 ID (
CUST_ID
)的客户信息之一 - 一位顾客裤子购买了 3 列 (
CUST_ID, PANT_TYPE, PANT_DATE
) - 其中一件客户衬衫购买了 3 列 (
CUST_ID, SHIRT_TYPE, SHIRT_DATE
)
此外,我希望排除某些裤子类型和某些衬衫类型(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。
解决方案
您可以尝试使用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”列中返回)。
推荐阅读
- python - 不明白这个 No module named 'tkinter' 错误
- javascript - 使用没有 React 的 Redux 导出函数
- android - 如何使用 Android LinearLayout 创建跨越多行的布局?
- javascript - 传单地图未正确渲染
- java - 在while循环java中跳过迭代
- apache - ExtractHL7Attributes NiFi Processor
- azure - AppRoleAssignments Errors With Null
- asp.net-core - IdentityServer4 losing original returnUrl when using External Login server
- c - how to use scanf to read an integer from the command line
- python-3.x - Tkinter 创作