根据销售人员将行更改为列

时间:2019-09-06 18:26:35

标签: sql sql-server

我有一张桌子,上面有一些销售员出售的产品。售卖后,不同的销售人员会根据他们的排名以不同的百分比获得同一产品的使用费。同一产品但不同销售人员的所有行都显示在不同的行中,但是如果产品和transactionID相同,我希望在同一行中显示。但是销售人员的姓名和特许权使用费应显示在下面的示例中。我也在动态枢轴和动态交叉表中尝试过,但无法解决。可能是我无法正确使用它。有人可以帮我吗。

我尝试过Dynamic Pivot :(我不想要这样的结果)

TranID  Product qty UntPrice    TotPrice    JOHN    LUCY
10011   Laptop  2   75          150         15  7.5
10012   Camara  3   15          45          4.5 2.25

--drop table #Royalty
Create table #Royalty
(
TranID int,
Product char(10),
Qty int,
UntPrice money,
TotPrice money,
SalesPrsn char(10),
[Royalty%] int,
[royalty$] money
)

insert into #Royalty values (10011,'Laptop', 2, 75,150,'JOHN',10,15)
insert into #Royalty values (10012,'Camara', 3, 15,45,'JOHN',10,4.5)
insert into #Royalty values (10011,'Laptop', 2, 75,150,'LUCY',5,7.5)
insert into #Royalty values (10012,'Camara', 3, 15,45,'LUCY',5,2.25)

select * from #Royalty

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.SalesPrsn) FROM #Royalty c FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = 'SELECT TranID,Product,Qty, untprice, TotPrice, ' + @cols + ' from 
            (select TranID,Product,Qty, untprice, TotPrice, SalesPrsn, [Royalty$] from #Royalty) x
            pivot 
            (max([Royalty$]) for [SalesPrsn] in (' + @cols + ')) p '
execute(@query)

原始数据:

TranID Product Qty UntPrice TotPrice SalesPrsn  Royalty% Royalty$
10011   Laptop   2  75      150     JOHN        10%      15
10012   Camara   3  15      45      JOHN        10%       4.5
10011   Laptop   2  75      150     LUCY         5%       7.5
10012   Camara   3  15      45      LUCY         5%       2.25

预期结果数据:

TranID  Product Qty UntPrice TotPrice SalesPrsn Royalty% Royalty$ SalesPrsn Royalty% Royalty$
10011   Laptop   2   75       150      JOHN       10%     15       LUCY       5%      7.5
10012   Camara   3   15        45      JOHN       10%      4.5     LUCY       5%      2.25

使用Dynamic Pivot :(我不想要这样的结果)

TranID  Product qty UntPrice    TotPrice    JOHN    LUCY                
10011   Laptop  2   75      150     15  7.5             
10012   Camara  3   15      45      4.5 2.25    

如果有人帮助我,将不胜感激。

1 个答案:

答案 0 :(得分:0)

结果中的列名必须唯一,因此您不能为不同的销售人员重复salesPrsn等列。下面的脚本将为您提供预期的结果,但列名前面加上人名。您可以让他们为您想要的名字命名,例如SalesPrsn1,SalesPrn2等。

CREATE OR REPLACE FUNCTION F_CERT.CERT_UPC_COMMON_DESC (UPC NUMERIC(14))
    RETURNS INTEGER
    LANGUAGE SQL
BEGIN
    DECLARE RETVAL INTEGER DEFAULT 0;
    IF 1=0 THEN
        SET RETVAL = 1;
    ELSE
        SET RETVAL = 100;
    END IF;
    RETURN RETVAL;
END @ 

SELECT F_CERT.CERT_UPC_COMMON_DESC (793936791660) AS C FROM SYSIBM.SYSDUMMY1 @