MS SQL-复杂的交叉联接视图,以显示产品组的价目表

时间:2019-02-20 15:51:06

标签: sql sql-server sql-view

我希望有人能提供帮助。

我有下面列出的4张桌子。

价目表中包含价目表列表

客户包含客户列表

ProductRatecardGroup 包含产品所属的组的列表

RatecardProductGroupClientRatecard 是一个查找表,用于确定哪个价目表适用于给定客户的某些产品组。

我需要创建一个显示此信息的视图。如果客户在 RatecardGroupClient 表中没有任何条目,则显示默认的价目表ID(在本例中为“ 6”)。

表的结构如下:

客户
ClientId
客户端名称

ProductRatecardGroup
ProductRatecardGroupId PK
RatecardGroupName

价目表
RatecardId PK
RatecardName

RatecardProductGroupClientRatecard
RatecardProductGroupClientRatecardId PK
ClientId FK
ProductRatecardGroupId FK
RatecardId FK

想象一下,我有2个客户和5个价目表产品组...

RatecardProductGroupClientRatecard表可能完全为空,我仍然应该获得10条记录(这将是每个客户每个产品组的标准价目表)。

如果我在RatecardProductGroupClientRatecard表中仅具有一个客户端的条目,我仍然应该获得10条记录(用户指定的价目表将覆盖默认值)。

我尝试了以下

SELECT DISTINCT
c.ClientId, 
prg.ProductRatecardGroupId, 
prg.ProductRatecardGroupName,
ISNULL(p.RatecardId,(SELECT RatecardId FROM Ratecard WHERE RatecardId = (SELECT RatecardDefaultRatecardId From Configuration))) AS 'RatecardId',
ISNULL(CONVERT(varchar(50),p.DateAdded), 'n/a') as 'DateAdded',
ISNULL((e.Firstname + ' ' + e.Surname),'n/a') as 'EmployeeName'
FROM

Client c 
LEFT JOIN ProductRatecardGroupClientRatecard prgcr ON 1 = 1
CROSS JOIN ProductRatecardGroup prg
LEFT JOIN ProductRatecardGroupClientRatecard p ON 
p.ClientId = c.ClientId AND 
p.ClientId = prgcr.ClientId AND prg.ProductRatecardGroupId = p.ProductRatecardGroupId AND p.Enabled = 1
LEFT JOIN Employee e ON p.EmployeeId = e.EmployeeId

这给了我以下内容:

+------+---+-------------+----+---------------------+------------+
| 2093 | 1 | Cameras     |  6 | n/a                 | n/a        |
| 2093 | 1 | Cameras     | 15 | Feb 20 2019  3:32PM | John Smith |
| 2093 | 2 | Accessories |  6 | n/a                 | n/a        |
| 2093 | 2 | Accessories | 11 | Feb 20 2019  3:32PM | John Smith |
| 2093 | 3 | Misc        |  6 | n/a                 | n/a        |
| 2093 | 3 | Misc        | 10 | Feb 20 2019  3:51PM | John Smith |
+------+---+-------------+----+---------------------+------------+

这几乎起作用,但是重复输入,显示标准价目表和客户特定的价目表。

有人可以为此指出正确的方向吗?

非常感谢。

我使用以下代码解决了这个问题:

SELECT * FROM 
(
	SELECT a.*,
	ROW_NUMBER() OVER (ORDER BY a.ClientId) AS AutoId,
	ROW_NUMBER() OVER (PARTITION BY a.ClientId, a.ProductRatecardGroupId ORDER BY a.CustomId DESC) AS rn
	FROM
	(
	SELECT DISTINCT
	c.ClientId, 
	prg.ProductRatecardGroupId, 
	prg.ProductRatecardGroupName,
	ISNULL(p.RatecardId,(SELECT RatecardId FROM Ratecard WHERE RatecardId = (SELECT RatecardDefaultRatecardId From Configuration))) AS 'RatecardId',
	ISNULL(CONVERT(varchar(50),p.DateAdded), 'n/a') as 'DateAdded',
	ISNULL((e.Firstname + ' ' + e.Surname),'n/a') as 'EmployeeName',
	p.RatecardId as 'CustomId'
	FROM

	Client c 
	LEFT JOIN ProductRatecardGroupClientRatecard prgcr ON 1 = 1
	CROSS JOIN ProductRatecardGroup prg
	LEFT JOIN ProductRatecardGroupClientRatecard p ON 
	p.ClientId = c.ClientId AND 
	p.ClientId = prgcr.ClientId AND prg.ProductRatecardGroupId = p.ProductRatecardGroupId AND p.Enabled = 1
	LEFT JOIN Employee e ON p.EmployeeId = e.EmployeeId
	) a
)
b
WHERE b.rn = 1

0 个答案:

没有答案