我的询问
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 |
如何为每个客户透视一行,“周”数作为列 -> 金额,“周”数作为列 -> 订单。
再次是下周的编号,例如:
|客户名称 |第-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 | | |
当提出这样的问题时,以易于理解和重现的格式提供示例 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 |