0

私の問題は、実際には複数のテーブルがあり、2 つのcaseステートメントを使用して 1 つの列ARV1と 1つの列を生成ICA1していることですが、結果が同じ行に生成される必要があります。を使用caseすると、2 つの列が生成されますが、値が 2 行で表示されます。私は何が欠けていますか?

問題は、テーブル 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
4

5 に答える 5

0

2 つのCASE式は同じロジックを採用しています。の値のみt5.WTCodeが異なります。その列に値がある可能性は低いためARV1ICA1同時にNULL、任意の行の少なくとも 1 つの計算列で常に を取得します。

于 2013-05-20T21:25:25.603 に答える
0

2 つの異なる値に対して異なる case ステートメントを入れています。したがって、行ごとにそのうちの 1 つが有効になり、他の 1 つが null になります。これが得られるものです。

于 2013-05-20T21:31:52.877 に答える
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 で使用しているものに近づけることができます。

編集:

あなたが与えた更新に基づいて、ピボットで作成したフィドルを次に示します。 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
于 2013-05-20T22:26:40.227 に答える