Sql server 如何正确使用pivot函数将多个值(或列)合并到SQL Server中的一列中?
我有一个包含UPC、Month和Week这三个主要列的表。 (以下截图) 是否可以创建一个视图或显示表格,将周数分组到每个唯一UPC的一列中,以便显示那么多行。 (像这样的例子) 我是否需要使用pivot函数对分组集进行分组来实现这一点 谢谢。 MS SQL Server 2008架构设置:Sql server 如何正确使用pivot函数将多个值(或列)合并到SQL Server中的一列中?,sql-server,sql-server-2012,pivot,Sql Server,Sql Server 2012,Pivot,我有一个包含UPC、Month和Week这三个主要列的表。 (以下截图) 是否可以创建一个视图或显示表格,将周数分组到每个唯一UPC的一列中,以便显示那么多行。 (像这样的例子) 我是否需要使用pivot函数对分组集进行分组来实现这一点 谢谢。 MS SQL Server 2008架构设置: DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT) INSERT
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
查询1:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
MS SQL Server 2008架构设置:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
查询1:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
MS SQL Server 2008架构设置:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
查询1:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
MS SQL Server 2008架构设置:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
查询1:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
:
DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT)
INSERT INTO @TABLE VALUES
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6),
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15),
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27),
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35),
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6),
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15),
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31),
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38),
(17 , 2529230007 , 12 , 51)
SELECT *
FROM (
SELECT t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month]
,'Yes' AS Value
,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10))
FROM @TABLE
WHERE t.UPC = UPC
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List]
FROM @TABLE t
GROUP BY t.UPC
,LEFT(DATENAME(MONTH , '1900' + RIGHT('00'
+ CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3)
)t
PIVOT (MAX(Value)
FOR [Month]
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
| UPC | WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------|
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) |
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes |
您可以使用STUFF和FOR XML来实现这一点。您可以使用STUFF和FOR XML来实现这一点。您可以使用STUFF和FOR XML来实现这一点。您可以使用STUFF和FOR XML来实现这一点。谢谢你,阿里先生。我可以知道“19000101”是什么意思吗?因为您将月份存储为整数值,所以我也可以使用Case语句,但我将该月数转换为模拟日期值,然后使用
DATENAME()
函数从该日期值中获取月份名称。另外,请仔细查看我已更改将整数月份转换为日期的方式,如果是12个月,它将在19000101中添加12个月,并将从日期值19010101返回1月份谢谢,M.Ali。我可以知道“19000101”是什么意思吗?因为您将月份存储为整数值,所以我也可以使用Case语句,但我将该月数转换为模拟日期值,然后使用DATENAME()
函数从该日期值中获取月份名称。另外,请仔细查看我已更改将整数月份转换为日期的方式,如果是12个月,它将在19000101中添加12个月,并将从日期值19010101返回1月份谢谢,M.Ali。我可以知道“19000101”是什么意思吗?因为您将月份存储为整数值,所以我也可以使用Case语句,但我将该月数转换为模拟日期值,然后使用DATENAME()
函数从该日期值中获取月份名称。另外,请仔细查看我已更改将整数月份转换为日期的方式,如果是12个月,它将在19000101中添加12个月,并将从日期值19010101返回1月份谢谢,M.Ali。我可以知道“19000101”是什么意思吗?因为您将月份存储为整数值,所以我也可以使用Case语句,但我将该月数转换为模拟日期值,然后使用DATENAME()
函数从该日期值获取月份名称。另外,请仔细查看我已更改将整数月份转换为日期的方式,因为如果是12个月,它将在19000101中添加12个月,并从日期值19010101返回1月