1

販売されたアイテムのエントリを含む販売注文データベースがあります。今年と過去 2 年間に販売された各部品の合計を表示したいと考えています。私の現在のクエリを以下に示します。(データベース内の特別なタイプの部品である「k」で終わる部品番号を検索しています。)

SELECT DISTINCT PRTNUM_28, sum(SHPQTY_28) AS TOTAL, PM.PMDES1_01
FROM   SO_Detail SOD
           JOIN PART_MASTER PM ON SOD.PRTNUM_28 = PM.PRTNUM_01
WHERE PRTNUM_28 LIKE '%k'
AND   SHPDTE_28 > '2011'
AND   SHPDTE_28 < '2012'
GROUP BY PRTNUM_28, PM.PMDES1_01
ORDER BY TOTAL DESC, PRTNUM_28

上記のクエリは、2012 年の各部品番号の合計を表示するのに問題なく機能しますが、同じ結果に過去 2 年間のデータを含めるにはどうすればよいでしょうか?

年ごとに、部品番号が存在する場合と存在しない場合があることに注意してください。つまり、2011 年には 2012 年または 2010 年に販売されなかった部品が含まれている場合があり、同様に 2011 年には 2012 年および/または 2010 年に販売された部品が含まれていない場合があります。このクエリを達成する方法がわかりません。

4

2 に答える 2

0

どの RDBMS を使用しているかはわかりませんが、任意の RDBMS に変更できます。DatePart関数は SQL Server に固有です。

ただし、各年のデータを別の列に表示する場合は、基本的に各年のデータをピボットする次のようなものを使用できます。

SELECT 
  PRTNUM_28, 
  sum(case when DatePart(yy, SHPDTE_28) = 2009 then SHPQTY_28 end) AS Total_2009, 
  sum(case when DatePart(yy, SHPDTE_28) = 2010 then SHPQTY_28 end) AS Total_2010, 
  sum(case when DatePart(yy, SHPDTE_28) = 2011 then SHPQTY_28 end) AS Total_2011, 
  sum(case when DatePart(yy, SHPDTE_28) = 2012 then SHPQTY_28 end) AS Total_2012,
  PM.PMDES1_01
FROM SO_Detail SOD
LEFT JOIN PART_MASTER PM 
  ON SOD.PRTNUM_28 = PM.PRTNUM_01
WHERE PRTNUM_28 LIKE '%k'
  AND SHPDTE_28 > '2009'
  AND SHPDTE_28 < '2012'
GROUP BY DatePart(yy, SHPDTE_28), PRTNUM_28, PM.PMDES1_01;

または、PIVOT関数にアクセスできる場合は、次を使用することもできます。

select *
from
(
  SELECT DatePart(yy, SHPDTE_28) As YR, 
    PRTNUM_28, 
    SHPQTY_28,
    PM.PMDES1_01
  FROM SO_Detail SOD
  LEFT JOIN PART_MASTER PM 
    ON SOD.PRTNUM_28 = PM.PRTNUM_01
  WHERE PRTNUM_28 LIKE '%k'
    AND SHPDTE_28 > '2009'
    AND SHPDTE_28 < '2012'
) src
pivot
(
  sum(SHPQTY_28)
  for yr in ([2009], [2010], [2011], [2012])
) piv
于 2012-12-14T01:44:07.647 に答える
0

また、年ごとに分割したいと仮定すると、おそらく次のようになります。

SELECT LEFT(SHPDTE_28,4) As YR, PRTNUM_28, sum(SHPQTY_28) AS TOTAL, PM.PMDES1_01
FROM SO_Detail SOD
JOIN PART_MASTER PM ON SOD.PRTNUM_28 = PM.PRTNUM_01
WHERE PRTNUM_28 LIKE '%k'
AND SHPDTE_28 > '2009'
AND SHPDTE_28 < '2012'
GROUP BY LEFT(SHPDTE_28,4), PRTNUM_28, PM.PMDES1_01
ORDER BY TOTAL DESC, PRTNUM_28, YR

ただし、テーブル定義がないと確信が持てません。

(通常、冗長として GROUP BY と一緒に DISTINCT を使用しないことにも注意してください。)

于 2012-12-14T00:20:56.243 に答える