第一次枢轴 SQL Server 2012
First time pivot SQL Server 2012
我需要帮助旋转 table。这是我的第一次尝试。
我已将数据提取到#temp table。我有两列,在我的#temp table、Customer Nr
和 product
中
一个客户号可以有多个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;
但是如果您想使用 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) |
我需要帮助旋转 table。这是我的第一次尝试。
我已将数据提取到#temp table。我有两列,在我的#temp table、Customer Nr
和 product
一个客户号可以有多个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;
但是如果您想使用 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) |