如何使用运算符IN和返回两列的子查询

时间:2013-01-16 20:30:30

标签: sql sql-server-2008

大家好,我需要你的帮助。

有桌子:

DataCollection
==================
PK            Code
smallint      RestaurantCode
smallint      Year
tinyint       Month
money         Amount
money         AccumulativeMonthsAmount
...

我需要每家餐厅的LastMonth的AccumulateAmount。

首先,我获得“当前年度”的每个餐厅的最后一个月(针对此案例):

SELECT RestaurantCode, MAX(Month) as Month FROM DataCollection
WHERE (Year >= 2012 AND YEAR <= 2012) GROUP BY RestaurantCode

现在我想将它用作子查询,以获取Last - AccumulativeMonthsAmount:

SELECT AccumulativeMonthsAmount FROM DataCollection
WHERE (RestaurantCode, Month)
    IN (SELECT RestaurantCode, MAX(Month) as Month FROM DataCollection
        WHERE (Year >= 2012 AND YEAR <= 2012) GROUP BY RestaurantCode)

但操作员IN,不工作,我应该怎么做?

按年和月排序的示例数据:

RestCode Amount Accumulative Year Month
123      343.3   345453.65   2012    12
123      124.7   345329.00   2012    11
...
122      312.2   764545.00   2012    12
122      123.4   764233.00   2012    11
...
999      500.98    2500.98   2012     6
999      100.59    2000.00   2012     5
...

我想在每个餐厅的最后一个月获得积累:

RestCode Accumulative Month
123         345453.65    12
122         764545.00    12
99          2500.98      6
...

3 个答案:

答案 0 :(得分:3)

SELECT dc.AccumulativeMonthsAmount 
  FROM dbo.DataCollection AS dc
  INNER JOIN 
  (
    SELECT RestaurantCode, MAX(Month)
      FROM dbo.PAL_Entries_Relatives
      WHERE [Year] = 2012
      GROUP BY RestaurantCode
  ) AS r(rc, m)
ON dc.RestaurantCode = r.rc
AND dc.[Month] = r.m;

随着要求的变化:

;WITH x AS 
(
  SELECT RestCode, Accumulative, [Month],
    rn = ROW_NUMBER() OVER (PARTITION BY RestCode ORDER BY [Month] DESC)
    FROM dbo.DataCollection -- or is it dbo.PAL_Entries_Relatives?
)
SELECT RestCode, Accumulative, [Month]
  FROM x
  WHERE rn = 1
  ORDER BY [Month] DESC, RestCode DESC;

答案 1 :(得分:1)

SQL Server中不允许使用该语法。您可以使用EXISTS执行类似的操作:

SELECT AccumulativeMonthsAmount
FROM DataCollection dc
WHERE exists (select 1
              from PAL_Entries_Relatives er
              where  (Year >= 2012 AND YEAR <= 2012)
              group by RestaurantCode
              having er.RestaurantCode = dc.RestaurantCode and
                     max(er.month) = dc.Month
             )

答案 2 :(得分:0)

SELECT AccumulativeMonthsAmount
FROM DataCollection
  INNER JOIN PAL_Entries_Relatives
    ON DataCollection.RestaurantCode = PAL_Entries_Relatives.RestaurantCode
WHERE (Year >= 2012 AND YEAR <= 2012)
GROUP BY DataCollection.RestaurantCode
HAVING AccumulativeMonthsAmount.Month = MAX(PAL_Entries_Relatives.Month)