Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:交叉表/透视价格表_Sql_Sql Server_Pivot_Crosstab_Sql Server 2014 - Fatal编程技术网

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