使用列号和行号进行 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的主要内容,如果未能解决你的问题,请参考以下文章

CF1B Spreadsheets

python 在列号和电子表格列名称之间转换(alpha ID)

VBA如何得到选中的多行 的行号和列号

稀疏矩阵的运算

请教在QTableView怎么才能不显示行号和列头

excle vba,如何查找一个已知值的行号和列号?