Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 同一查询中的多个事例正在生成多行_Sql Server 2008_Database Administration_Sapb1 - Fatal编程技术网

Sql server 2008 同一查询中的多个事例正在生成多行

Sql server 2008 同一查询中的多个事例正在生成多行,sql-server-2008,database-administration,sapb1,Sql Server 2008,Database Administration,Sapb1,我的问题是,实际上我有多个表,我使用两个case语句为ARV1生成一列,为ICA1生成一列,但我需要在同一行中生成结果。当我使用usecase时,生成两列,但值显示在两行中。我错过了什么 问题是,我有一张发票,表OINV和表INV5,表中有持有税,我需要把发票放在同一行,发票上的所有持有税都在不同的列中,谢谢 这是示例表 CREATE TABLE Invoice ( Id INT, InvoiceNumber VARCHAR(10), Total INT ) INSERT INTO

我的问题是,实际上我有多个表,我使用两个case语句为ARV1生成一列,为ICA1生成一列,但我需要在同一行中生成结果。当我使用usecase时,生成两列,但值显示在两行中。我错过了什么


问题是,我有一张发票,表OINV和表INV5,表中有持有税,我需要把发票放在同一行,发票上的所有持有税都在不同的列中,谢谢

这是示例表

CREATE TABLE Invoice
(
  Id INT, InvoiceNumber VARCHAR(10), Total INT    
)

INSERT INTO Invoice
VALUES
(1,'200000',100),
(2,'200001',200),
(3,'200002',500),
(4,'200003',700),
(5,'200004',200),
(6,'200005',100),
(7,'200006',300)

CREATE TABLE HoldingTaxes
(
 Id INT, HoldingTaxCode VARCHAR(10),HoldedAmount INT) 
)

INSERT INTO HoldingTaxes
VALUES
(1,'ARV1',20),
(1,'ARV2',30),
(1,'ARV3',35),
(2,'ICA1',20),
(2,'ARV1',10),
(1,'ICA3',50)
我想要一个返回如下内容的查询:

InvoiceNumber Total  ARV1 ARV2 ARV3  ICA1  ICA2   ICA3
200000          100   20   30   35   null   null   50
这就是我试图用我真正的桌子做的

SELECT T0.DocNum [No. Factura],
CASE
WHEN t5.WTCode ='ARV1' and (t5.U_Ret_ML <>0 AND t5.U_Ret_ML is not null)
THEN 'Perro1'
else NULL
end AS ARV1
,
CASE
WHEN t5.WTCode ='ICA1' and (t5.U_Ret_ML <>0 AND t5.U_Ret_ML is not null)
THEN 'Perro2'
else NULL
end AS ICA1
FROM OINV T0
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN OSLP T4 ON T0.SlpCode = T4.SlpCode 
INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode 
INNER JOIN OITW T3 ON T2.ItemCode = T3.ItemCode
INNER JOIN INV5 T5 ON T5.AbsEntry = T0.DocEntry
WHERE T1.WhsCode = T3.WhsCode`enter code here`
GROUP BY T0.DocNum,T0.DocDate,T0.DocTotal, T0.GrosProfit, T4.SlpName,T5.WTCODE,t5.U_Ret_ML

这两个CASE表达式采用相同的逻辑。只有t5.WTCode中的值不同。由于该列不太可能同时具有值ARV1和ICA1,因此任何行中至少有一个计算列中总是会出现NULL。

您为两个不同的值放置了不同的case语句。因此,对于每一行,其中一个是有效的,另一个是空的,这就是您得到的结果。

我将使用PIVOT来解决这个问题-如SQL Fiddle中所示:

SELECT  EmpName
       ,CASE WHEN ARV1 > 0 THEN 'PERRO1' ELSE NULL END
       ,CASE WHEN ARV2 > 0 THEN 'PERRO2' ELSE NULL END
       ,CASE WHEN ICA1 > 0 THEN 'PERRO3' ELSE NULL END
FROM (SELECT t0.EmpName, t1.Name, t1.Value 
      FROM Table0 t0 INNER JOIN Table1 t1 ON t0.Id = t1.Id ) as  src 
PIVOT (
  MAX(src.Value) 
  FOR src.Name IN ([ARV1],[ARV2],[ICA1])) as p
如果您有问题并且愿意分享您的结构,我可以将其与您在SQL Fiddle上使用的内容进行更紧密的匹配

编辑:

根据您提供的更新,这是我用pivot创建的小提琴。


这就是我解决问题的方法,感谢大家的帮助

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(t5.WTCode) 
            FROM INV5 T5
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT Factura, Fecha, SN, TotalFacturaSinImpuesto, Total$Descuento, Total$Impuesto, Total$Retenciones, Total$Factura, CostoTotal$Factura, Margen$Factura, Costo$PromedioInventario, Margen$Inventario, NombreVendedor, ' + @cols + ' from
            (
                select T0.DocNum [Factura], T0.DocDate [Fecha], T0.CardName [SN],SUM(T1.LineTotal) [TotalFacturaSinImpuesto], T0.DiscSum [Total$Descuento],  T0.VatSum [Total$Impuesto],(T0.WTSum*-1) [Total$Retenciones],t5.WTCode [CodigoRetencion],t5.U_Ret_ML [CantidadRetenida],T0.DocTotal [Total$Factura],SUM(T1.GrossBuyPr*T1.Quantity) [CostoTotal$Factura], T0.GrosProfit [Margen$Factura],SUM(T1.Quantity*T3.AvgPrice) [Costo$PromedioInventario],(SUM(T1.LineTotal*T1.Quantity))-(SUM(T1.Quantity*T3.AvgPrice)) [Margen$Inventario], T4.SlpName [NombreVendedor]
                FROM OINV T0
                INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
                INNER JOIN OSLP T4 ON T0.SlpCode = T4.SlpCode 
                INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode 
                INNER JOIN OITW T3 ON T2.ItemCode = T3.ItemCode
                INNER JOIN INV5 T5 ON T5.AbsEntry = T0.DocEntry
                WHERE T1.WhsCode = T3.WhsCode 
                GROUP BY T0.DocNum,T0.DocDate, T0.CardName,T0.BaseAmnt, T0.DiscSum,  T0.VatSum,  T0.WTSum,T0.DocTotal, T0.GrosProfit, T4.SlpName,T5.WTCODE,T5.U_RET_ML
           ) x
            pivot 
            (
                sum(CantidadRetenida)
                for CodigoRetencion in (' + @cols + ')
            ) p '


execute(@query)
替代方法:

选择inv.InvoiceNumber、inv.Total、[ARV1]、[ARV2]、[ARV3]、[ICA1]、[ICA2]、[ICA3] 从发票库存 参加 选择id、[ARV1]、[ARV2]、[ARV3]、[ICA1]、[ICA2]、[ICA3] 从…起 从保持轴t1中选择* PivotSumHoldingTaxCode的装入量 [ARV1]、[ARV2]、[ARV3]、[ICA1]、[ICA2]、[ICA3]t2 ht ON inv.id=ht.id


sql FIDLE:

那么我应该怎么做才能在同一行ARV1和ICA1上得到表INV5 T5有两个值呢?,thanks@Skatalitico-你不能。由于您也按t5.WTCode分组,并且希望它至少有两个不同的值,因此您将得到多行。也许你没有正确地总结数据。问题是,我有一张发票,表OINV,表INV5,表INV5,表INV5,表中有保留,我需要把发票放在同一行,发票上有保留,列在不同的列中,谢谢
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(t5.WTCode) 
            FROM INV5 T5
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT Factura, Fecha, SN, TotalFacturaSinImpuesto, Total$Descuento, Total$Impuesto, Total$Retenciones, Total$Factura, CostoTotal$Factura, Margen$Factura, Costo$PromedioInventario, Margen$Inventario, NombreVendedor, ' + @cols + ' from
            (
                select T0.DocNum [Factura], T0.DocDate [Fecha], T0.CardName [SN],SUM(T1.LineTotal) [TotalFacturaSinImpuesto], T0.DiscSum [Total$Descuento],  T0.VatSum [Total$Impuesto],(T0.WTSum*-1) [Total$Retenciones],t5.WTCode [CodigoRetencion],t5.U_Ret_ML [CantidadRetenida],T0.DocTotal [Total$Factura],SUM(T1.GrossBuyPr*T1.Quantity) [CostoTotal$Factura], T0.GrosProfit [Margen$Factura],SUM(T1.Quantity*T3.AvgPrice) [Costo$PromedioInventario],(SUM(T1.LineTotal*T1.Quantity))-(SUM(T1.Quantity*T3.AvgPrice)) [Margen$Inventario], T4.SlpName [NombreVendedor]
                FROM OINV T0
                INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
                INNER JOIN OSLP T4 ON T0.SlpCode = T4.SlpCode 
                INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode 
                INNER JOIN OITW T3 ON T2.ItemCode = T3.ItemCode
                INNER JOIN INV5 T5 ON T5.AbsEntry = T0.DocEntry
                WHERE T1.WhsCode = T3.WhsCode 
                GROUP BY T0.DocNum,T0.DocDate, T0.CardName,T0.BaseAmnt, T0.DiscSum,  T0.VatSum,  T0.WTSum,T0.DocTotal, T0.GrosProfit, T4.SlpName,T5.WTCODE,T5.U_RET_ML
           ) x
            pivot 
            (
                sum(CantidadRetenida)
                for CodigoRetencion in (' + @cols + ')
            ) p '


execute(@query)