【问题标题】:SQL Server : Crosstab/Pivot Price ListSQL Server:交叉表/透视价目表
【发布时间】:2015-04-15 23:47:53
【问题描述】:

我已经花了 2 天的时间试图让它工作,但还没有接近解决这个问题。

我将数据汇总在一起以制作价格表视图

| 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

提前谢谢你。

【问题讨论】:

  • 您是否要根据产品列加入两个表?
  • 您能展示一下您 2 天辛勤工作的一些尝试吗?
  • @Mee 现在只有 1 个视图可供使用。这 2 个示例是我从视图中的数据中需要的。
  • @Mihai 我没有保存我所做的任何事情。我的前几个我尝试派生表来显示使用相同产品和类别的 QtyFrom 的最小值,但我无法让它与 QtyFrom 和 QtyMin 一起使用。最后一次尝试是使用派生表和派生列来做同样的事情,但仍然无法思考如何让这一切为返回 QtyFrom 和 QtyTo 的 3 列工作,然后匹配行

标签: sql sql-server pivot crosstab sql-server-2014


【解决方案1】:

您尝试过使用conditional Aggregate

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 

或使用Pivot。在数据透视源查询中,您需要创建范围列以在数据透视列列表中使用它。

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 ([1 | 9],
                         [10 | 49],
                         [50 | 99]))piv 

更新:如果您不知道价格中断,请使用Dynamic Pivot

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 

【讨论】:

  • 这仅在知道价格中断时才有效,它们会根据类别而变化。
  • 非常感谢,在对列进行排序时遇到问题,但设法解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多