第一次枢轴 SQL Server 2012

First time pivot SQL Server 2012

我需要帮助旋转 table。这是我的第一次尝试。

我已将数据提取到#temp table。我有两列,在我的#temp table、Customer Nrproduct

一个客户号可以有多个1产品。如何为一个客户编号显示最多 3 个产品?

这是我的第一次尝试:

SELECT DISTINCT
    cust_no,
    products
FROM 
    #temp
PIVOT 
    (cust_no, 
     CASE WHEN [Product 1] IS NULL THEN NULL ELSE [Product 2] END AS [Product 2],
     CASE WHEN [Product 2] IS NULL THEN NULL ELSE [Product 3] END AS [Product 3])

我卡在这里了。我在 SQL Server 2012

工作

您实际上不需要使用 PIVOT 函数来获取结果。您可以使用带有 CASE 表达式的聚合函数,以及 row_number() 之类的窗口函数,将数据从行转换为列。窗口函数将为客户中的每个产品生成一个唯一编号。然后使用此数字将值放入每一列。

这是一些示例数据:

CREATE TABLE temp
    ([CustomerNr] int, [Product] varchar(9));

INSERT INTO temp
    ([CustomerNr], [Product])
VALUES
    (1234, 'Rice'),
    (1234, 'Tuna'),
    (1234, 'Sauce'),
    (2345, 'Jam'),
    (3456, 'Spaghetti'),
    (3456, 'Jelly');

使用聚合函数和 CASE 表达式,您的代码将是:

select CustomerNr,
  Product1 = max(case when rn = 1 then Product else null end),
  Product2 = max(case when rn = 2 then Product else null end),
  Product3 = max(case when rn = 3 then Product else null end)
from
(
  select CustomerNr, Product,
    rn = row_number() over(partition by customerNr order by product)
  from temp
) d
group by CustomerNr;

SQL Fiddle with Demo

但是如果您想使用 PIVOT 函数,您仍然需要使用窗口函数来帮助确定每个客户的产品数量:

select CustomerNr, Product1, Product2, Product3
from
(
  select CustomerNr, Product,
    new_col = 'Product'
                +cast(row_number() over(partition by customerNr order by product) as varchar(1))
  from temp
) d
pivot
(
  max(product) 
  for new_col in (Product1, Product2, Product3)
) piv;

参见SQL Fiddle with Demo。任一版本都会给出结果:

| CustomerNr | Product1 |  Product2 | Product3 |
|------------|----------|-----------|----------|
|       1234 |     Rice |     Sauce |     Tuna |
|       2345 |      Jam |    (null) |   (null) |
|       3456 |    Jelly | Spaghetti |   (null) |