0

これは私のスクリプトです

SELECT a.PLUCODE as [Code],a.ITEMNAME as [Item],  
    sum(a.janQTY) AS [2012 QTY] ,sum(a.janAmt) AS [2012 AMT],  
    sum(b.janQTY) AS [2013 QTY] ,sum(b.janAmt) AS [ ]
FROM 2012_Table 
LEFT OUTER JOIN 2013_Table b  ON a.PLUCODE=b.PLUCODE 
WHERE a.CATEGORY='Category1'  
GROUP BY a.PLUCODE,a.ITEMNAME 
ORDER BY a.PLUCODE  

出力は

Code Item     2012 QTY     2012 AMT     2013 QTY  2013 AMT  
0312 ItemOne  67           837,500      21        262,500    

[2012 QTY] と [2012 AMT] の私の出力は正しいですが、[2013 QTY] と [2013 AMT] では間違っています。数量は 1 で、金額は 12,500 である必要があります。正しいスクリプトを教えてください。このため。

4

3 に答える 3

1

デカルトの結果が得られます。21 エントリ @ 12,500 = 262,500。おそらく、それぞれ独自のメリットで事前クエリを実行してから、左結合する必要があります。2013 年の表は 2012 年の表と同じ構造であると仮定しています。

select
      PQ1.PLUCode,
      PQ1.Item,
      PQ1.[2012 QTY],
      PQ1.[2012 AMT],
      PQ2.[2013 QTY],
      PQ2.[2013 AMT]
   from
      ( select a.PLUCode, 
               a.ItemName as [Item],
               sum( a.JanQty ) as [2012 QTY],
               sum( a.JanAmt ) as [2012 AMT]
           from 2012_Table a
           where a.Category = 'Category1'
           group by a.PLUCode, a.ItemName
           order by a.PLUCode ) PQ1
      LEFT JOIN
      ( select b.PLUCode, 
               b.ItemName as [Item],
               sum( b.JanQty ) as [2013 QTY],
               sum( b.JanAmt ) as [2013 AMT]
           from 2013_Table b
           where b.Category = 'Category1'
           group by b.PLUCode, b.ItemName
           order by b.PLUCode ) PQ2
         ON PQ1.PLUCode = PQ2.PLUCode
于 2013-05-17T01:19:01.067 に答える
0

テーブル A をカテゴリでのみフィルタリングしているため、PLUCode がカテゴリ間で繰り返される場合、JOIN の右側に指定された PLU を持つすべてのレコードが含まれます。何が起こっているかを確認するには、SUM 集計と GROUP BY 句を削除してから、A.Category と B.Category を含めます。

于 2013-05-17T01:25:11.193 に答える
0

これはうまくいくはずです:

SELECT 
    a.PLUCODE as [Code],
    a.ITEMNAME as [Item],  
    sum(Case When Yr=2012 Then a.janQTY Else 0 End) AS [2012 QTY],
    sum(Case When Yr=2012 Then a.janAmt Else 0 End) AS [2012 AMT],  
    sum(Case When Yr=2013 Then a.janQTY Else 0 End) AS [2013 QTY],
    sum(Case When Yr=2013 Then a.janAmt Else 0 End) AS [2013 AMT],  
FROM (
    Select 2012 As Yr, * From 2012_Table 
 UNION ALL
    Select 2013 As Yr, * From 2013_Table
      ) a  
WHERE a.CATEGORY='Category1'  
GROUP BY a.PLUCODE,a.ITEMNAME 
ORDER BY a.PLUCODE  
于 2013-05-17T01:19:34.907 に答える