2013-05-20 3 views
0

Моя проблема на самом деле у меня есть несколько таблиц, и я использую два оператора case для генерации одного столбца для ARV1 и один для 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 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 

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

Если возникли проблемы и готовы поделиться своей структуры, я могу поставить это в аа более точное соответствие на то, что вы используете на SQL Fiddle.

Edit:

на основе обновления вы дали, вот скрипку я создал с шарниром. 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 отличается. Поскольку этот столбец вряд ли будет иметь значение ARV1 и ICA1, в то же время вы всегда получите NULL по крайней мере в одном из вычисленных столбцов в любой строке.

+0

так, что я должен сделать, чтобы получить на той же строке ARV1 И ICA1 стол INV5 T5 имеет два значения ?, благодарит – Skatalitico

+0

@Skatalitico - Вы не можете. Так как вы также «GROUP BY» 't5.WTCode', и вы ожидаете, что у него будет (по крайней мере) два разных значения, вы получите несколько строк. Возможно, вы не суммируете данные правильно. – HABO

0

Вы помещаете разные операторы case для 2 разных значений. Поэтому для каждой строки один из них будет действительным, а другой - нулевым, что вы получаете.

+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

Альтернативный способ:

ВЫБРАТЬ inv.InvoiceNumber, inv.Total, [ARV1 ], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3]
FROM INVOICE inv
JOIN (
SELECT, идентификатор, [ARV1], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3]
ОТ
(SELECT * FROM HoldingTaxes) t1
PIVOT (SUM (HoldedAmount) для HoldingTaxCode в
([ARV1], [ARV2], [ARV3], [ICA1], [ICA2], [ICA3])) t2 ) ht
ON inv.id = ht.ID

SQL скрипку: http://sqlfiddle.com/#!3/ea3a4/10

Смежные вопросы