SQL Server:交叉表/透视价格表
我已经花了两天的时间试图让这个工作,但没有得到任何接近解决这个问题 我已经将数据汇集在一起,形成了一个价格表视图SQL Server:交叉表/透视价格表,sql,sql-server,pivot,crosstab,sql-server-2014,Sql,Sql Server,Pivot,Crosstab,Sql Server 2014,我已经花了两天的时间试图让这个工作,但没有得到任何接近解决这个问题 我已经将数据汇集在一起,形成了一个价格表视图 | Category | Product | QtyFrom | QtyTo | Price | ------------------------------------------------------------ | Category#1 | Product#1 | 1 | 9 | 4.99 | | Category
| Category | Product | QtyFrom | QtyTo | Price |
------------------------------------------------------------
| Category#1 | Product#1 | 1 | 9 | 4.99 |
| Category#1 | Product#2 | 1 | 9 | 5.99 |
| Category#1 | Product#3 | 1 | 9 | 6.99 |
| Category#1 | Product#1 | 10 | 49 | 4.75 |
| Category#1 | Product#2 | 10 | 49 | 5.75 |
| Category#1 | Product#3 | 10 | 49 | 6.75 |
| Category#1 | Product#1 | 50 | 99 | 4.50 |
| Category#1 | Product#2 | 50 | 99 | 5.50 |
| Category#1 | Product#3 | 50 | 99 | 6.50 |
| Category#1 | Product#1 | 100 | 999 | 4.25 |
| Category#1 | Product#2 | 100 | 999 | 5.25 |
| Category#1 | Product#3 | 100 | 999 | 6.25 |
| Category#2 | Product#4 | 1 | 9 | 4.99 |
| Category#2 | Product#5 | 1 | 10 | 5.99 |
| Category#2 | Product#6 | 1 | 9 | 6.99 |
| Category#2 | Product#4 | 10 | 49 | 4.75 |
| Category#2 | Product#5 | 11 | 50 | 5.75 |
| Category#2 | Product#6 | 10 | 49 | 6.75 |
| Category#2 | Product#4 | 50 | 99 | 4.50 |
| Category#2 | Product#5 | 51 | 99 | 5.50 |
| Category#2 | Product#6 | 50 | 99 | 6.50 |
我需要将此交叉制表以生成价目表。最终结果将按需要返回以下结果的单个类别进行查询
| Category#1 | 1 | 9 | 10 | 49 | 50 | 99 |
--------------------------------------------------------
| Product#1 | 4.99 | 4.75 | 4.50 |
| Product#2 | 5.99 | 5.75 | 5.50 |
| Product#3 | 6.99 | 6.75 | 6.50 |
或者
| Category#2 | 1 | 9 | 1 | 10 | 10 | 49 |
--------------------------------------------------------
| Product#4 | 4.99 | | 4.75 |
| Product#5 | | 5.99 | |
| Product#6 | 6.99 | | 6.75 |
正如您所看到的,根据谁输入数据,他们可能会犯错误,并在一个组内调整价格折扣。但我仍然需要将3个最低的QtyFrom/QtyTo行返回(一旦我有了这些数据,我将生成一个单独的报告,只显示每个类别的价格折扣数量,以便他们可以在生成价格列表和调整价格折扣之前运行该报告)
某些类别可能没有3个价格折扣,而其他类别可能有更多。但我总是需要3列
使用SQL Server 2014
提前谢谢。您是否尝试过使用
条件聚合
SELECT Product,
Max(CASE WHEN QtyFrom >= 1 AND QtyTo <= 9 THEN Price END) [1 | 9],
Max(CASE WHEN QtyFrom >= 10 AND QtyTo <= 49 THEN Price END) [10 | 49],
Max(CASE WHEN QtyFrom >= 50 AND QtyTo <= 99 THEN Price END) [50 | 99]
FROM Yourtable
WHERE Category = 'Category#1'
GROUP BY Product
更新:如果您不知道价格优惠,请使用动态透视
DECLARE @cols VARCHAR(max)='',
@sql NVARCHAR(max)
SET @cols = (SELECT DISTINCT '[' + CONVERT(VARCHAR(50), QtyFrom) + ' | '
+ CONVERT(VARCHAR(50), QtyTo) + '],'
FROM Yourtable
WHERE Category = 'Category#1'
FOR xml path(''))
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql = 'SELECT *
FROM (SELECT CONVERT(VARCHAR(50), QtyFrom) + '' | ''
+ CONVERT(VARCHAR(50), QtyTo) AS Rang,
Product,
price
FROM Yourtable
WHERE Category = ''Category#1'') a
PIVOT (Max(price)
FOR Rang IN (' + @cols + '))piv '
EXEC Sp_executesql @sql
您是否正在尝试加入基于产品列的两个表?能否显示您两天工作中的一些尝试?@Mee现在只有一个视图可供使用。这两个示例是我从视图中的数据中需要的。@Mihai我没有保存我所做的任何操作。我的前几次尝试使用相同的产品和类别来显示QtyFrom的最小值,但是我无法使它与QtyFrom和QtyMin一起工作。最后一次尝试是使用派生表和派生列来做同样的事情,但仍然无法考虑如何让这三列都工作,返回QtyFrom和QtyTo,然后匹配行。这仅在知道价格折扣时有效,它们会根据类别变化。非常感谢,列排序有问题,但已成功解决。
DECLARE @cols VARCHAR(max)='',
@sql NVARCHAR(max)
SET @cols = (SELECT DISTINCT '[' + CONVERT(VARCHAR(50), QtyFrom) + ' | '
+ CONVERT(VARCHAR(50), QtyTo) + '],'
FROM Yourtable
WHERE Category = 'Category#1'
FOR xml path(''))
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql = 'SELECT *
FROM (SELECT CONVERT(VARCHAR(50), QtyFrom) + '' | ''
+ CONVERT(VARCHAR(50), QtyTo) AS Rang,
Product,
price
FROM Yourtable
WHERE Category = ''Category#1'') a
PIVOT (Max(price)
FOR Rang IN (' + @cols + '))piv '
EXEC Sp_executesql @sql