我希望有人能提供帮助。
我有下面列出的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