14

我有一张带有产品 ID 和名称的表格,还有一张带有这些产品在特定日期的库存的表格。比如Item1had 6stock on1-1-20148stock on 2-1-2014。我试图在存储过程中显示这些,使其看起来像日历,显示一个月中的所有日期以及单元格中可用的库存。展示这一点的最佳方式是什么?

例如:

Name  | 1-1-2014 | 2-1-2014 | 3-1-2014 | 4-1-2014
Item1 |     6    |     8    |          |    6
Item2 |          |     2    |     1    |

原始表 - 名称

 ID |   Name 
  1 |  Item1
  2 |  Item2

原始表格 - Stockdates

 ID | NameID  | Stock |    Date 
  1 |    1    |   8   |  2-1-2014    
  2 |    2    |   2   |  4-1-2014 
4

2 回答 2

19

这是您的示例表

SELECT * INTO #Names
FROM
(
SELECT 1 ID,'ITEM1' NAME 
UNION ALL
SELECT 2 ID,'ITEM2' NAME 
)TAB

SELECT * INTO #Stockdates
FROM
(      
SELECT 1 ID,1 NAMEID,8 STOCK,'2-1-2014 ' [DATE]
UNION ALL
SELECT 2 ID,2 NAMEID,2 STOCK,'4-1-2014 ' [DATE]
)TAB

将连接数据放入临时表

SELECT N.NAME,S.[DATE],S.STOCK 
INTO #TABLE
FROM #NAMES N
JOIN #Stockdates S ON N.ID=S.NAMEID

获取枢轴的列

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 106) + ']', 
               '[' + CONVERT(NVARCHAR, [DATE], 106) + ']')
               FROM    (SELECT DISTINCT [DATE] FROM #TABLE) PV  
               ORDER BY [DATE]

现在转动它

DECLARE @query NVARCHAR(MAX)
SET @query = '           
              SELECT * FROM 
             (
                 SELECT * FROM #TABLE
             ) x
             PIVOT 
             (
                 SUM(STOCK)
                 FOR [DATE] IN (' + @cols + ')
            ) p      

            '     
EXEC SP_EXECUTESQL @query

你的结果就在这里

在此处输入图像描述

于 2014-12-11T13:37:21.327 回答
2

第 1 步 - 填补空白(可能不需要)

如果您的库存表不包含每种产品每天的库存,那么您必须从其他地方获取一个月内的所有日期。您可以使用递归 CTE 生成它们:(省略变量声明)

with dates as
(
   select @startdate as [date]
   union ALL
   select   [date] + 1 
   from dates
   where    [date] < @enddate
)
select  @strDays = COALESCE(@strDays + ', ['+ convert(varchar(8), [date],112) + ']', '['+ convert(varchar(8), [date],112) + ']') 
from    dates;

您可以使用您喜欢的日期格式,但在所有查询中维护它很重要。

第 2 步 - 将数据转换为正常形式。您可以选择将其存储在临时表中,也可以再次使用 CTE 并将此步骤与步骤 3 结合。

dates(从上方)与products(完整)和(左)连接stock,因此您获得如下表格:

date
product_id    
items

对于没有库存的产品和日期,您显示 0.isnull就可以了。确保将date列转换为varchar与上述 CTE 中相同的格式。

date第 3 步 -在动态查询中按列对表(在第 2 步获得)进行透视。

我可以给你更多细节,但不是现在。您可以在另一个响应中看到类似的内容: Spread distinct values over different columns

于 2014-12-11T12:42:43.243 回答