使用列号和行号进行 UNPIVOT 和 JOIN
Posted
技术标签:
【中文标题】使用列号和行号进行 UNPIVOT 和 JOIN【英文标题】:UNPIVOT and JOIN using col and row numbers 【发布时间】:2017-07-07 11:41:38 【问题描述】:我有每个客户和每个日期的订单数据,我通过以下方式呈现:
ID Date Record ColNumber RowNumber
----------------------------------------------------------------
ColNumber / RowNumber 是公式中信息的位置 (示例:产品描述在公式的第一列,
FORMULAR
________________
Description BarCode Amount RetailPrice Others
-----------------------------------------------------
因此配方器上第 4 个产品的描述将采用以下形式:
ID Date Record ColNumber RowNumber
----------------------------------------------------------------
ID Date Description 1 4
“记录”包含公式的所有列(描述、条形码、金额、零售价等)
所以我们的目标是有一个包含以下列的表格:
ID Date Description BarCode Amount Retail
------------------------------------------------------------------------
我觉得我需要混合使用 PIVOT 和 JOIN,但我所做的只是让我回到了最初的“原始”表。
这里有一个示例让你理解:
IF OBJECT_ID ('tempdb..#temptab') IS NOT NULL
DROP TABLE #temptab
CREATE TABLE #temptab (
ID INT NOT NULL,
SellDate date NOT NULL,
Record nvarchar(255),
ColNumber int,
RowNumber int)
INSERT INTO #temptab (ID, SellDate, Record, ColNumber, RowNumber) VALUES
(1, '2017-01-01', 'Cookie1', 1, 1),
(1, '2017-01-01', '21312332', 1, 2),
(1, '2017-01-01', '3', 1, 2),
(1, '2017-01-01', 'Banana1', 2, 1),
(2, '2017-01-01', 'Apple1', 1, 1),
(3, '2017-01-01', 'Peach1', 1, 1),
(3, '2017-01-01', '546462', 1, 2);
这给出了:
ID SellDate Record ColNumber RowNumber
1 2017-01-01 Cookie1 1 1
1 2017-01-01 CH212332 2 1
1 2017-01-01 3 3 1
1 2017-01-01 Banana1 1 2
2 2017-01-01 Apple1 1 1
3 2017-01-01 Peach1 1 1
3 2017-01-01 546462 2 1
最后我想要一张这样的桌子
ID SellDate Description BarCode Amount
1 2017-01-01 Cookie1 CH212332 3
1 2017-01-01 Banana1
2 2017-01-01 Apple1
3 2017-01-01 Peach1 546462
(缺失的值要么被剩下的信息补上,我显然没有把整个数据都加到表里,要么用NULL的)
【问题讨论】:
请提供样本数据和期望的结果。 您能否提供更多关于“产品描述在公式的第一列”这一行的信息? 添加了您的两个请求。如果还不清楚,请告诉我 您的列号字段没有意义...您能解释一下吗 现在它们已得到纠正。 ColNumber 代表公式上的不同列(描述、条形码、金额等),因此对于第一个“Cookie1”,它是 ColNumber = 1,因为它位于“描述”列中。行号代表相同客户和 SellDate 的相同配方的产品数量。对于“Banana1”,它是第 2 行,因为 ID1 的客户在同一天购买了“Cookie1”和“Banana1”。我希望它更清楚 【参考方案1】:试试这个,它会给你预期的结果
SELECT ID
,SellDate
,ISNULL(Record, '') AS Record
,ISNULL(BarCode, '') AS BarCode
,ISNULL(Amount, '') AS Amount
FROM
(
SELECT ID, SellDate,
CASE WHEN ISNUMERIC(Record)=0 THEN Record ELSE NULL END AS Record
,CASE WHEN ISNUMERIC(Record)=1 AND
LEN(CASE WHEN ISNUMERIC(Record)=1 THEN Record ELSE NULL END)>1 THEN Record ELSE NULL END AS BarCode
,CASE WHEN LEN(CASE WHEN ISNUMERIC(Record)=1 THEN Record ELSE NULL END)=1 THEN Record ELSE NULL END AS Amount
FROM #temptab
)DT
结果
ID SellDate Record BarCode Amount
--------------------------------------------------
1 2017-01-01 Cookie1
1 2017-01-01 21312332
1 2017-01-01 3
1 2017-01-01 Banana1
2 2017-01-01 Apple1
3 2017-01-01 Peach1
3 2017-01-01 546462
【讨论】:
我知道你区分不同类型数据的方法。但我也有“CF8978977R”形式的条形码和其他可能包含相同数字的列。在这种情况下,如何使用有关列和行的信息更改代码? 我改变了样本的外观,看到它并没有模棱两可。我的坏 我已经按照您的预期回答了 谢谢!我会尝试从那里开始。以上是关于使用列号和行号进行 UNPIVOT 和 JOIN的主要内容,如果未能解决你的问题,请参考以下文章