4

メインとユニットの2つのテーブルがあります。

メインテーブル:

Todate   Unit   CategoryID   Quantity
1/7/2012  1        S            300
1/7/2012  1        U            350
2/7/2012  2        S            220
3/7/2012  2        S             50
3/7/2012  2        U            330
4/7/2012  1        S            200
4/7/2012  1        U            180

S = 販売、U = アップグレード

単位表:

UnitNum   UnitName
1         Measures
2         Performance

私はこの結果を得る必要があります:

Todate   UnitNum   UnitName    Sales    Upgrades
1/7/2012    1      Measures     300       350
2/7/2012    2      Performance  220
3/7/2012    2      Performance   50       330
4/7/2012    1      Measures     200       180

つまり、CategoryID の値に応じて、販売とアップグレードの 2 つの列を作成する必要があり、それらを同じ行に配置する必要があります。私がこれまでに持っているのはこれです

select Todate, Main.Unit, UnitName,
case when CategoryID = 'S' then Quantity end as Sales,
case when CategoryID = 'U' then Quantity end as Upgrades
from Main join Units on Main.UnitNum = Units.UnitNum
group by  Todate, Main.Unit, UnitName

それは私に2つの新しい列を与えますが、それらは2つの別々の行にあります..

これを解決する助けをいただければ幸いです。ありがとうございました

4

4 に答える 4

1

次のようなものが必要です。

SELECT
    Todate, m.Unit, UnitName,
    Sales = (SELECT SUM(Quantity)
             FROM dbo.Main m2 
             WHERE m.Todate = m2.Todate AND CategoryID = 'S'),
    Updates = (SELECT SUM(Quantity)
               FROM dbo.Main m2 
               WHERE m.Todate = m2.Todate AND CategoryID = 'U')
FROM
    dbo.Main m 
INNER join 
    dbo.Units u on m.Unit = u.UnitNum
GROUP BY  
    Todate, m.Unit, UnitName
ORDER BY  
    Todate, m.Unit, UnitName

これは、探している出力を返しているようです:

ここに画像の説明を入力

于 2012-08-05T20:27:56.053 に答える
1

caseステートメントの周りに集計クエリが必要なだけです。

select m.todate
     , m.unit
     , u.unitname
     , sum(case when m.categoryid = 'S' then quantity end ) as sales
     , sum(case when m.categoryid = 'U' then quantity end ) as upgrages
  from main m
  join units u
    on m.unit = u.unitnum
 group by m.todate, m.unit, u.unitname
于 2012-08-05T20:06:25.060 に答える
0

これにもPIVOTを使用できます。

WITH data AS (
  SELECT
    m.Todate,
    m.UnitNum,
    u.UnitName,
    Category = CASE m.CategoryID
                 WHEN 'S' THEN 'Sales'
                 WHEN 'U' THEN 'Upgrades'
               END,
    Quantity
  FROM Main m
  INNER JOIN Units u
  ON m.UnitNum = u.UnitNum
)
SELECT
  Todate,
  UnitNum,
  UnitName,
  Sales,
  Upgrades
FROM data
PIVOT (
  SUM(Quantity) FOR Category IN (Sales, Upgrades)
) p
;
于 2013-01-28T07:08:53.620 に答える
0

メインテーブルをそれ自体と自己結合する必要があります。

 SELECT m1.todate, m1.unit AS unitnum, u.unitname,
        SUM(m1.quantity) AS sales, SUM(m2.quantity) AS upgrades
   FROM (SELECT todate, unit, quantity FROM Main WHERE category = 'S') AS m1
   FULL OUTER JOIN
        (SELECT todate, unit, quantity FROM Main WHERE category = 'U') AS m2
     ON m1.todate = m2.todate AND m1.unit = m2.unit
   JOIN units AS u
     ON m1.unit = u.unitnum
  GROUP BY m1.todate, m1.unit, u.unitname
  ORDER BY m1.todate, m1.unit, u.unitname;

同じクエリを記述する同等の方法は他にもたくさんあります。ただし、これは問題の対称性をかなりよく保持します。(サブクエリの間で FULL OUTER JOIN を使用するように更新され、m1m2アップグレードなしの販売または販売なしのアップグレードがある場合に対処します。 )

于 2012-08-05T20:26:32.333 に答える