2013-05-20 5 views
0

내 문제는 실제로 여러 테이블을 가지고 있으며 ARV1에 대해 하나의 열을 생성하기 위해 두 개의 case 문을 사용하고 ICA1에 대해 하나의 결과를 생성해야합니다. 같은 줄에. case을 사용할 때 두 개의 열을 생성하지만 값은 두 개의 행으로 표시됩니다. 내가 뭘 놓치고 있니?두 개 이상의 동일한 쿼리에서 하나 이상의 행을 생성하는 경우

나는 인보이스 표 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 

답변

0

나는이 문제를 해결하기 위해 PIVOT을 사용 -는 SQL 바이올린에서 입증 된 바와 같이 :

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 

http://sqlfiddle.com/#!3/a6ff0/2

당신의 가진 문제는, 나는 AA 가까이 일치로이 당신의 구조를 공유하고자 넣을 수있는 경우 당신이 SQL Fiddle에서 사용하고있는 것.

편집 : 당신이 준 업데이트를 바탕으로

, 여기에 내가 피벗으로 만든 바이올린을합니다. http://sqlfiddle.com/#!3/47511/4

SELECT * FROM 
(SELECT InvoiceNumber = Invoice.InvoiceNumber 
     ,Total   = Invoice.Total 
     ,HoldingTaxCode = HoldingTaxes.HoldingTaxCode 
     ,HoldedAmount = HoldingTaxes.HoldedAmount 
FROM  Invoice 
LEFT JOIN HoldingTaxes 
ON  Invoice.Id = HoldingTaxes.Id) PivotSource 
PIVOT 
(
SUM(HoldedAmount) FOR HoldingTaxCode IN(ARV1, ARV2, ARV3, ICA1, ICA2, ICA3) 
) PivotData 
ORDER BY InvoiceNumber 
+0

나는 당신의 대답을 기반으로 몇 가지 설명을 추가, 덕분에 – Skatalitico

+0

업데이 트를 기반으로 바이올린을 업데이 트되었습니다. – Pirion

0

두 개의 CASE 표현식은 동일한 로직을 사용한다. t5.WTCode의 값만 다릅니다. 이 열은 ARV1ICA1 값을 가질 가능성이 거의 없으므로 어느 행의 계산 열 중 적어도 하나에 항상 NULL이 표시됩니다.

+0

그래서 난 같은 행 ARV1 그리고 ICA1 테이블에 INV5 T5는 @Skatalitico 두 값? 감사 – Skatalitico

+0

을 가지고 얻기 위해 무엇을해야하는지 - 당신은 할 수 없습니다. 당신도'GROUP BY''t5.WTCode' 이후로 여러분은 (적어도) 두 개의 서로 다른 값을 가질 것으로 기대하고 있습니다. 그러면 여러분은 여러 개의 행을 얻을 것입니다. 아마도 데이터를 올바르게 요약하지 않은 것일 수 있습니다. – HABO

0

두 개의 서로 다른 값에 대해 서로 다른 case 문을 사용하고 있습니다. 따라서 각 행에 대해 하나는 유효하고 다른 하나는 널 (null)입니다. 이는 사용자가 얻는 것입니다.

+0

것은, 인보이스 표 OINV 있고 테이블 INV5는 보유와 테이블입니다, 나는 그것에 적용되는 다른 열에있는 모든 보유와 동일한 행 인보이스에 넣어해야합니다 – Skatalitico

0

이 내가 도움을 모든 사람에게,

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) 
1

대체 방법 덕분에 내 문제를 해결하는 방법입니다

SELECT inv.InvoiceNumber, inv.Total, [ARV1 ], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3]
인보이스에서
JOIN (
SELECT ID [ARV1], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3]
FROM
에서 T1 HoldingTaxCode위한
PIVOT (SUM (HoldedAmount)을 (HoldingTaxes SELECT *)
([ARV1], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3])) t2 ) ht
ON inv.id = ht.ID

SQL 바이올린 : http://sqlfiddle.com/#!3/ea3a4/10