Sql 使用列和行号取消填充并连接

Sql 使用列和行号取消填充并连接,sql,sql-server,join,pivot,unpivot,Sql,Sql Server,Join,Pivot,Unpivot,我有每个客户和每个日期的订单数据,我以以下方式呈现: ID Date Record ColNumber RowNumber ---------------------------------------------------------------- ColNumber/RowNumber是公式中信息的位置 (示例:产品说明在公式的第一列 FORMULAR

我有每个客户和每个日期的订单数据,我以以下方式呈现:

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

(缺少的值将由信息的reste填充,我显然没有在表中添加全部数据,或者使用NULL)

尝试此操作,它将给出您预期的结果

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 

请提供样品数据和预期结果。请提供更多关于“产品说明在公式的第一列”这一行的信息?添加了您的两个请求。如果仍然不清楚,请告诉我您的列号字段没有意义…您可以解释一下,现在它们已被更正。ColNumber代表公式中的不同列(说明、条形码、金额等)。因此,对于第一个“Cookie1”,它是ColNumber=1,因为它位于“说明”列中.行号代表同一客户和销售日期的同一配方上的产品数量。对于“Banana1”,这是第2行,因为ID1的客户在同一日期购买了“Cookie1”和“Banana1”。我希望这很清楚。我知道您如何区分不同类型的数据。但我还有“CF8978977R”格式的条形码和其他可能包含相同数字的列。在这种情况下,我如何使用有关列和行的信息更改代码?我更改了示例的外观,看到它没有歧义。我的badi已回答为您预期的结果谢谢!我将尝试从那里开始。