Sql server 如何正确使用pivot函数将多个值(或列)合并到SQL Server中的一列中?

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

我有一个包含UPC、Month和Week这三个主要列的表。 (以下截图)

是否可以创建一个视图或显示表格,将周数分组到每个唯一UPC的一列中,以便显示那么多行。 (像这样的例子)

我是否需要使用pivot函数对分组集进行分组来实现这一点

谢谢。

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 |

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月