Я не уверен, что это невероятно запутанно, поэтому заранее извиняюсь.
CREATE TABLE TestOrder
(
[OrderLineID] INT NOT NULL IDENTITY PRIMARY KEY,
[Item] NVARCHAR(30) NULL,
[OrderQty] INT NULL,
[Status1] INT NULL,
[Quantity_at_sts1] INT NULL,
[Status2] INT NULL,
[Quantity_at_sts2] INT NULL,
[Status3] INT NULL,
[Quantity_at_sts3] INT NULL,
[Status4] INT NULL,
[Quantity_at_sts4] INT NULL,
[Status5] INT NULL,
[Quantity_at_sts5] INT NULL,
[OrderRef] NVARCHAR(10) NULL
)
INSERT INTO TestOrder
values
('TSHIRT','1','100','1','0','0','0','0','0','0','0','0','Ord.1'),
('SOCKS','4','50','4','0','0','0','0','0','0','0','0','Ord.2'),
('SHIRT','5','10','1','50','2','0','0','0','0','0','0','Ord.3'),
('SHIRT','5','100','2','0','0','0','0','0','0','0','0','Ord.3'),
('SOCKS','10','10','4','50','2','0','0','0','0','0','0','Ord.4'),
('SOCKS','10','50','3','100','1','0','0','0','0','0','0','Ord.4')
.
| OrderLineID | Item | OrderQty | Status1 | Quantity_at_sts1 | Status2 | Quantity_at_sts2 | Status3 | Quantity_at_sts3 | Status4 | Quantity_at_sts_4 | Status5 | Quantity_at_sts5 | OrderRef |
|-------------|------|----------|---------|------------------|---------|------------------|---------|------------------|---------|-------------------|---------|------------------|----------|
| 1 |TSHIRT| 1 | 100 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.1 |
| 2 |SOCKS | 4 | 50 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.2 |
| 3 |SHIRT | 5 | 10 | 1 | 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.3 |
| 4 |SHIRT | 5 | 100 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.3 |
| 5 |SOCKS | 10 | 10 | 4 | 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.4 |
| 6 |SOCKS | 10 | 50 | 3 | 100 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.4 |
Таким образом, эта таблица фактически является таблицей заказов, и все столбцы "status1, amount_at_sts1, status2 ..." и т. Д. Фактически являются прогрессом этого заказа. Представьте, что у вас есть различные статусы от 10 до 100, 10 - «не начато», 100 - «завершено и отправлено». Столбец «OrderRef» фактически является ключевым идентификатором для этих заказов; например 4 строки для «Ord.3» и «Ord.4» на самом деле представляют собой только один отдельный элемент в каждом заказе, но с разными статусами в каждой строке.
До сих пор я использовал оператор case, чтобы поместить все эти статусы в один более удобный для чтения столбец (игнорируйте все преобразования, так как они требуются только для фактических данных):
select
CASE
WHEN status2 = 0 THEN '['+CAST(status1 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts1 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))
WHEN status2 > 0 AND status3 = 0 THEN '['+CAST(status1 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts1 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - '+'['+CAST(status2 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts2 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))
WHEN status3 > 0 AND status4 = 0 THEN '['+CAST(status1 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts1 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - '+'['+CAST(status2 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts2 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - ['+CAST(status3 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts3 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))
WHEN status4 > 0 AND status5 = 0 THEN '['+CAST(status1 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts1 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - '+'['+CAST(status2 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts2 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - ['+CAST(status3 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts3 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10)) + ' - ['+CAST(status4 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts4 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))
when status5 > 0 then '['+CAST(status1 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts1 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - '+'['+CAST(status2 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts2 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))+' - ['+CAST(status3 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts3 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10)) + ' - ['+CAST(status4 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts4 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10)) + ' - ['+CAST(status5 AS NVARCHAR(10))+'] '+CAST(CAST(CAST(quantity_at_sts5 AS DECIMAL(20, 6)) AS FLOAT) AS NVARCHAR(10))
END AS 'all_statuses'
, *
from testorder
.
| all_statuses | OrderLineID | Item | OrderQty | Status1 | Quantity_at_sts1 | Status2 | Quantity_at_sts2 | Status3 | Quantity_at_sts3 | Status4 | Quantity_at_sts_4 | Status5 | Quantity_at_sts5 | OrderRef |
|------------------|--------------|------|----------|---------|------------------|---------|------------------|---------|------------------|---------|-------------------|---------|------------------|----------|
| [100] 1 | 1 |TSHIRT| 1 | 100 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.1 |
| [50] 4 | 2 |SOCKS | 4 | 50 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.2 |
| [10] 1 - [50] 2 | 3 |SHIRT | 5 | 10 | 1 | 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.3 |
| [100] 2 | 4 |SHIRT | 5 | 100 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.3 |
| [10] 4 - [50] 2 | 5 |SOCKS | 10 | 10 | 4 | 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.4 |
| [50] 3 - [100] 1 | 6 |SOCKS | 10 | 50 | 3 | 100 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | Ord.4 |
Мой идеал состоит в том, чтобы сворачивать каждое уникальное значение OrderRef, при этом all_statuses представляют собой суммы сумм во ВСЕХ строках с этим значением OrderRef:
| all_statuses | OrderQty | OrderRef |
|----------------------------|------------|-----------|
| [100] 1 | 1 | Ord.1 |
| [50] 4 | 4 | Ord.2 |
| [10] 1 - [50] 2 - [100] 2 | 5 | Ord.3 |
| [10] 4 - [50] 5 - [100] 1 | 10 | Ord.4 |
, однако у меня есть 2 проблемы, с которыми я борюсь:
- Получение всех статусов (даже в нескольких строках) в одном столбце
- Суммирование сумм по нескольким строкам, которые имеют одинаковый статус (например, в случае Ord.4)
У меня небольшой опыт работы с STUFF FOR XML PATH, и я подумал, что мог бы сделать какой-то смешной CASE с комбинацией STUFF, но я изо всех сил пытаюсь найти метод. Это слишком сложно сделать?