使用日期作为列的SQL数据透视表

使用日期作为列的SQL数据透视表,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我怎样才能得到这张桌子: 看起来也是这样的: 我已经尝试了pivots,但到目前为止无法使用,因为ItemID列是一个varchar列。 以下是到目前为止我对样本数据的了解: IF OBJECT_ID ('tempdb..#TempSupplierDemands') IS NOT NULL DROP TABLE #TempSupplierDemands DECLARE @VEN varchar(10) SET @VEN = '10161'; DECLARE @VenR

我怎样才能得到这张桌子: 看起来也是这样的: 我已经尝试了pivots,但到目前为止无法使用,因为ItemID列是一个varchar列。 以下是到目前为止我对样本数据的了解:

    IF OBJECT_ID ('tempdb..#TempSupplierDemands') IS NOT NULL
  DROP TABLE #TempSupplierDemands

  DECLARE @VEN varchar(10)
  SET @VEN = '10161';

  DECLARE @VenRecordID as VARCHAR(MAX)
  SET @VenRecordID = 
  (SELECT VEN_RecordID
  FROM VEN
  WHERE VEN_VENDORID = @VEN)

  CREATE TABLE #TempSupplierDemands(
  VendorID NVARCHAR(100),
  ItemID VARCHAR(MAX),
  ItemDescription VARCHAR(MAX),
  MondayWeekStart DATETIME,
  SDM_DemandDate DATETIME,
  SDM_DemandWeek INT)

  INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000940','CONN ROD/BRG ASSY, 21 CFM','2017-03-20 00:00:00.000','2017-03-24 00:00:00.000','12');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000508','PLATE, OIL PUMP ASSY W/OPS','2017-03-27 00:00:00.000','2017-03-29 00:00:00.000','13');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000198','CRANKCASE, ASSY, 3 CYL REED','2017-03-27 00:00:00.000','2017-03-29 00:00:00.000','13');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000374','CONNECTING ROD MACH, 24 CFM 116 LG','2017-03-27 00:00:00.000','2017-03-29 00:00:00.000','13');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','06DA507674','TERM PLATE, 5 PIN','2017-03-27 00:00:00.000','2017-03-29 00:00:00.000','13');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','06DA405234','CONNECTING ROD ASSY (4,6 CYL)','2017-04-10 00:00:00.000','2017-04-10 00:00:00.000','15');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','06DA405234','CONNECTING ROD ASSY (4,6 CYL)','2017-04-10 00:00:00.000','2017-04-11 00:00:00.000','15');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1TU0502','MOTOR CASE - MACHINED','2017-04-10 00:00:00.000','2017-04-13 00:00:00.000','15');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1TA0915D','CASING, OUTLET(4.0/2.8)','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB002222','MOTOR CASE MACHINING, FRAME 2','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003224','OUTLET CASE MACHINING','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003226','IRA BEARING COVER MACHINING','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003228','IRA DISCHARGE COVER MACHINING','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003205','ROTOR CASE MACHINING','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003126','IRA BEARING COVER MACHINING','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1TA0915D','CASING, OUTLET(4.0/2.8)','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003128','IRA DISCHARGE COVER MACHINING','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000508','PLATE, OIL PUMP ASSY W/OPS','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000198','CRANKCASE, ASSY, 3 CYL REED','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','0AMB000374','CONNECTING ROD MACH, 24 CFM 116 LG','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003105','ROTOR CASE MACHINING','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');
INSERT INTO #TempSupplierDemands (VendorID,ItemID,ItemDescription,MondayWeekStart,SDM_DemandDate,SDM_DemandWeek) VALUES ('10161','1BZB003122','MOTOR COVER MACHINING','2017-04-17 00:00:00.000','2017-04-19 00:00:00.000','16');

declare @cols varchar(max)


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

declare @query varchar(max) 

select @query = 'select *
from 
(
  select VendorID,ItemID, ItemDescription ,MondayWeekStart
  from #TempSupplierDemands
) src
pivot
(
  COUNT(ItemID)
  for MondayWeekStart in (' + @cols + ')
) piv;'


execute(@query)

我使用了来自您图像的输入,我使用动态sql解决了它。希望你明白

CREATE TABLE #T (ItemID VARCHAR(255), ItemDesc VARCHAR(255), MondayWeekStart DATE, SDM_DemandDate DATETIME, SDM_DemandWeek INT)
INSERT INTO #T VALUES
('0AMB000940','CONN ROD/BRG ASSY, 21 CFM','2017-03-27 00:00:00.000','2017-03-31 00:00:00.000','12'),
('0AMB000508','PLATE, OIL PUMP ASSY W/OPS','2017-04-03 00:00:00.000','2017-04-05 00:00:00.000','13'),
('0AMB000198','CRANKCASE, ASSY, 3 CYL REED','2017-04-03 00:00:00.000','2017-04-05 00:00:00.000','13'),
('0AMB000374','CONNECTING ROD MACH, 24 CFM 116 LG','2017-04-03 00:00:00.000','2017-04-05 00:00:00.000','13'),
('06DA507674','TERM PLATE, 5 PIN','2017-04-03 00:00:00.000','2017-04-05 00:00:00.000','13'),
('06DA405234','CONNECTING ROD ASSY (4,6 CYL)','2017-04-17 00:00:00.000','2017-04-17 00:00:00.000','15'),
('06DA405234','CONNECTING ROD ASSY (4,6 CYL)','2017-04-17 00:00:00.000','2017-04-18 00:00:00.000','15'),
('1TU0502','MOTOR CASE - MACHINED','2017-04-17 00:00:00.000','2017-04-20 00:00:00.000','15'),
('1TA0915D','CASING, OUTLET(4.0/2.8)','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB002222','MOTOR CASE MACHINING, FRAME 2','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB003224','OUTLET CASE MACHINING','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB003226','IRA BEARING COVER MACHINING','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB003228','IRA DISCHARGE COVER MACHINING','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB003205','ROTOR CASE MACHINING','2017-04-24 00:00:00.000','2017-04-25 00:00:00.000','16'),
('1BZB003126','IRA BEARING COVER MACHINING','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('1TA0915D','CASING, OUTLET(4.0/2.8)','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('1BZB003128','IRA DISCHARGE COVER MACHINING','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('0AMB000508','PLATE, OIL PUMP ASSY W/OPS','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('0AMB000198','CRANKCASE, ASSY, 3 CYL REED','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('0AMB000374','CONNECTING ROD MACH, 24 CFM 116 LG','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('1BZB003105','ROTOR CASE MACHINING','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16'),
('1BZB003122','MOTOR COVER MACHINING','2017-04-24 00:00:00.000','2017-04-26 00:00:00.000','16')

CREATE TABLE #W  (WeekStart DATE)
INSERT INTO #W VALUES
('20170313'),('20170320'),('20170327'),('20170403'),('20170410'),('20170417'),('20170424'),('20170501')

DECLARE @StartDate DATE, @EndDate DATE
SET @StartDate = DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0) --Monday of current week
SET @EndDate = (SELECT MAX(WeekStart) FROM #W)

DECLARE @Sql NVARCHAR(MAX), @PvtColumns VARCHAR(MAX), @IsNullPvtColumns AS VARCHAR(MAX)

SET @PvtColumns = substring(
                    (
                        Select ',['+ CAST(w.WeekStart AS VARCHAR(255)) + ']' AS [text()]
                        From #W AS w
                        Where w.WeekStart >= @StartDate AND w.WeekStart <= @EndDate
                        For XML PATH ('')
                    ), 2, 4000)

SET @IsNullPvtColumns = substring(
                    (
                        Select ',ISNULL(['+ CAST(w.WeekStart AS VARCHAR(255)) + '], 0) AS [' + CAST(w.WeekStart AS VARCHAR(255)) + '] ' AS [text()]
                        From #W AS w
                        Where w.WeekStart >= @StartDate AND w.WeekStart <= @EndDate
                        For XML PATH ('')
                    ), 2, 4000)

SET @Sql = 'SELECT pvt.ItemId, pvt.ItemDesc, ISNULL(bkl.Backlog, 0) AS Backlog, ' + @IsNullPvtColumns + ' FROM ( '
SET @Sql = @Sql + 'SELECT ItemId, ItemDesc, w.WeekStart, SDM_DemandWeek FROM ' 
SET @Sql = @Sql + '(SELECT WeekStart FROM #W WHERE WeekStart >= '''+ CAST(@StartDate AS VARCHAR(255)) + ''' AND WeekStart <= '''+ CAST(@EndDate AS VARCHAR(255))+''') AS w  LEFT OUTER JOIN #T AS t ON w.WeekStart = t.MondayWeekStart ) AS r '
SET @Sql = @Sql + 'PIVOT ' 
SET @Sql = @Sql + '(SUM(SDM_DemandWeek) FOR r.WeekStart IN ('+ @PvtColumns +')'
SET @Sql = @Sql + ') AS pvt '
SET @Sql = @Sql + 'LEFT OUTER JOIN (SELECT ItemId, SUM(SDM_DemandWeek) AS Backlog FROM #T WHERE SDM_DemandDate < '''+ CAST(@StartDate AS VARCHAR(255)) + ''' GROUP BY ItemID, ItemDesc) AS bkl '
SET @Sql = @Sql + 'ON bkl.ItemId = pvt.ItemId '
SET @Sql = @Sql + 'WHERE pvt.ItemId IS NOT NULL '
SET @Sql = @Sql + 'ORDER BY pvt.ItemID '

EXEC sp_executesql @sql

你可以发布你尝试使用的透视图,这样我就可以尝试修改它,或者告诉你我是否发现了任何问题?数据透视可能很棘手。如果您将数据以结构化文本而不是图像的形式发布,这也会有所帮助,这样我就可以快速复制/粘贴数据以测试我的答案,而不必一行一行地重新键入垃圾行。此外,有些人在工作时无法查看图像链接,图像链接可能会被破坏。Kevin感谢你的回答,但我无法在“积压”专栏中发表文章,因为该专栏在本周之前就有所有项目。哦,我一定错过了什么,我要一杯look@user955485我更改了现在包含积压工作的查询。在积压工作和周列中我需要的数量是该周的项目数量。我想我的问题还不够清楚。我不需要SDM_Demand week作为待办事项和每周日期列中的数字。我想弄清楚的是如何在weeks and backlog(周和待办事项)列中获取特定周的项目数。我在代码中更改了一些内容,我正在按预期工作。谢谢
ItemId      ItemDesc                            Backlog  2017-04-24  2017-05-01
0AMB000198  CRANKCASE, ASSY, 3 CYL REED         13       16          0
0AMB000374  CONNECTING ROD MACH, 24 CFM 116 LG  13       16          0
0AMB000508  PLATE, OIL PUMP ASSY W/OPS          13       16          0
1BZB002222  MOTOR CASE MACHINING, FRAME 2       0        16          0
1BZB003105  ROTOR CASE MACHINING                0        16          0
1BZB003122  MOTOR COVER MACHINING               0        16          0
1BZB003126  IRA BEARING COVER MACHINING         0        16          0
1BZB003128  IRA DISCHARGE COVER MACHINING       0        16          0
1BZB003205  ROTOR CASE MACHINING                0        16          0
1BZB003224  OUTLET CASE MACHINING               0        16          0
1BZB003226  IRA BEARING COVER MACHINING         0        16          0
1BZB003228  IRA DISCHARGE COVER MACHINING       0        16          0
1TA0915D    CASING, OUTLET(4.0/2.8)             0        32          0