1

我有一个销售订单数据库,其中包含已售商品的条目。我想显示本年度和前两年销售的每个零件的总数。我当前的查询如下所示。(它正在搜索以“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 年每个零件号的总数,但是我如何将前两年的数据也包含在相同的结果中?

请注意,对于每一年,零件编号可能存在​​也可能不存在 - 即 2011 年可能包含 2012 年或 2010 年未售出的零件,同样,2011 年可能不包含 2012 年和/或 2010 年售出的零件。我是不知道如何实现这个查询。

4

2 回答 2

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

虽然没有表定义,但我无法确定。

(另请注意,您通常不会将 DISTINCT 与 GROUP BY 一起用作其冗余。)

于 2012-12-14T00:20:56.243 回答
0

我不确定您使用的是什么 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 回答