从两行值创建一个 PIVOT SQL 表到两列,动态数量

问题描述 投票:0回答:1

我的询问

select
custname, case when date < '11/26/2023' then -1 else datepart(wk,date) end 'week#', sum(amount) sales,
count(salesid) orders from SalesTable inner join CustomerTable c
on salestable.CustID=c.CustID
where date < '1/27/2024' and c.CustID = 10285 or c.CustID = -2
group by c.custid,custname, [address],case when date < '11/26/2023' then -1 else datepart(wk,date) end,
case when date < '11/26/2023' then '11/25/2023' else DATEADD(dd,7-(DATEPART(dw,date)),date) end 
order by 1,2

获取任意行一周内的所有客户销售额(总金额、周数、订单金额)。 喜欢:

客户名称 周# 销售 订单
客户AAA -1 974697.41 62013
客户AAA 1 10.01 5
客户AAA 2 10 2
客户AAA 2 372.95 11
客户AAA 3 70.86 13
客户AAA 3 0 3
客户AAA 4 8.08 2
客户AAA 5 20 6
客户AAA 48 0 38
客户AAA 49 84.27 2
CustXYZ -1 12.12 1
CustXYZ 1 22.59 1
CustXYZ 4 117.9 1
CustXYZ 48 19.3 1

enter image description here

如何为每个客户透视一行,“周”数作为列 -> 金额,“周”数作为列 -> 订单。 再次是下周的编号,例如: |客户名称 |第-1 周销售 |周-1 订单 |第 1 周销售 |第 1 周订单 |第 2 周销售 |第 2 周订单 |第 3 周销售 |第 3 周订单 |第 4 周销售 |第 4 周订单 |第 5 周销售 |第 5 周订单 |第 48 周销售 |第 48 周订单 |第 49 周销售 |第 49 周订单 | |--------|----------|----------|------------|----- ----|----------|----------|---------|----------|- --------|----------|------------|---------|-------- ---|----------|------------|------------|
|客户AAA | 974697.41 | 62013 | 62013 10.01 | 10.01 5 | 382.95 | 382.95 13 | 70.86 | 16 | 16 8.08 | 2 | 20 | 6 | 0 | 38 | 38 84.27 | 84.27 2 | |客户XYZ | 12.12 | 12.12 1 | 22.59 | 22.59 1 | | | | | 117.9 | 117.9 1 | | | 19.3 | 19.3 1 | | |

enter image description here

sql sql-server pivot
1个回答
0
投票

当提出这样的问题时,以易于理解和重现的格式提供示例 DDL 和 DML 非常有帮助:

DECLARE @Table TABLE (custname VARCHAR(20), week INT, sales DECIMAL(10,2), orders INT);
INSERT INTO @Table (custname, week, sales, orders) VALUES
('CustAAA', -1 , 974697.41 , 62013), ('CustAAA', 1 , 10.01 , 5), ('CustAAA', 2 , 10 , 2), 
('CustAAA', 2 , 372.95 , 11), ('CustAAA', 3 , 70.86 , 13), ('CustAAA', 3 , 0 , 3), 
('CustAAA', 4 , 8.08 , 2), ('CustAAA', 5 , 20 , 6), ('CustAAA', 48 , 0 , 38), 
('CustAAA', 49 , 84.27 , 2), ('CustXYZ', -1 , 12.12 , 1), ('CustXYZ', 1 , 22.59 , 1), 
('CustXYZ', 4 , 117.9 , 1), ('CustXYZ', 48 , 19.3 , 1);

SELECT p.custname, MAX(p.sales1) AS Price1, MAX(p.orders1) AS Invoice1, MAX(p.sales2) AS Price2, MAX(p.orders2) AS Invoice2, 
                   MAX(p.sales3) AS Price3, MAX(p.orders3) AS Invoice3, MAX(p.sales53) AS Price53, MAX(p.orders53) AS Invoice53
  FROM (
SELECT i.sales, i.orders, i.custname, 
       'sales' + CAST(week AS VARCHAR(2)) AS WeekSales, 'orders' + CAST(week AS VARCHAR(2)) AS WeekOrders
  FROM @Table i
       ) a
    PIVOT (
           SUM(sales) FOR WeekSales IN (sales1, sales2, sales3, sales53)
          ) p
    PIVOT (
           SUM(orders) FOR WeekOrders IN (orders1, orders2, orders3, orders53)
          ) p
 GROUP BY p.custname;

在这里,我们将周列复制了两次,对于我们想要做的每个枢轴复制一次。 然后,这只是生成每个值的列表并根据需要聚合的情况。

客户名称 价格1 发票1 价格2 发票2 价格3 发票3 价格53 发票53
客户AAA 10.01 5 372.95 11 70.86 13
CustXYZ 22.59 1
© www.soinside.com 2019 - 2024. All rights reserved.