SQL:在不同行(不同月份)的列上选择具有相同值的用户

时间:2014-05-14 13:56:08

标签: sql sql-server sql-server-2000

我有一张桌子(finances_history)
这只是一张桌子,但为了向你展示我把它分成两个区块的内容,如下所示:


userID || month  || bill   || value 
------------------------------------
u01    || 201401 || energy || 0
u01    || 201402 || energy || 0
------------------------------------
u02    || 201401 || energy || 0
u02    || 201402 || energy || 0
------------------------------------
u03    || 201401 || energy || 75
u03    || 201402 || energy || 0
------------------------------------
u04    || 201401 || energy || 90
u04    || 201402 || energy || 90
------------------------------------
u05    || 201401 || energy || 85
u05    || 201402 || energy || 90
------------------------------------
u06    || 201401 || energy || 0
u06    || 201402 || energy || 0
------------------------------------

userID || month  || bill   || value 
------------------------------------
u01    || 201401 || rent   || 300
u01    || 201402 || rent   || 300
------------------------------------
u02    || 201401 || rent   || 350
u02    || 201402 || rent   || 400
------------------------------------
u03    || 201401 || rent   || 0
u03    || 201402 || rent   || 0
------------------------------------
u04    || 201401 || rent   || 0
u04    || 201402 || rent   || 0
------------------------------------
u05    || 201401 || rent   || 0
u05    || 201402 || rent   || 0
------------------------------------
u06    || 201401 || rent   || 0
u06    || 201402 || rent   || 0
------------------------------------


此表上有不同的用户,但它记录了一年中不同月份的信息(在这种情况下只有两个月,1月 - 201401年和2月 - 201402年)。

同一个用户也可以有两种不同类型的账单(在这种情况下只有两种不同的能源和租金),但如果用户有一张账单要支付(至少在一个月内,或两者兼而有之,他将不会有另一个账单(两个月内其他账单上的值将为0)......或者我可以让两个月内两个账单的价值均为0的用户。

我只需要“选择”具有至少一个价值不同于0的票据的用户(userID)(考虑4行,两个月)和票据的值(不是0)两个月都是一样的。

所以,我正在寻找的是一个“SELECT”,在我上面的样本中,可以给我用户u01和u04(唯一符合标准的人,至少一个价值不同于0的账单)至少有一个月和这些值是相等的。)

  • 用户u01是SELECTED,因为在201401和201402个月的帐单租金具有相同的价值。

  • 未选择用户u02,因为该帐单在201401和201402个月租用了不同的值。

  • 未选择用户u03,因为201401和201402月的账单能量值不同。

  • 用户u04被选中,因为在201401和201402个月的账单能量具有相同的值。

  • 未选择用户u05,因为201401和201402月的账单能量值不同。

  • 未选择用户u06,因为201401和201402两个账单(能源和租金)的值均为0。

我希望有人可以帮助我 Ps。:它是一个MS SQL Server。

感谢。

1 个答案:

答案 0 :(得分:0)

一些统计功能对此有帮助。

SELECT DISTINCT userID
FROM   Utilities
GROUP BY userID, bill
HAVING  AVG(value) > 0
   AND  STDEV(value) = 0
ORDER BY userID

AVG是平均值,条件是账单类型的平均值大于0。 STDEV是标准差,长话短说,只有当组中的每个值相同时,标准差才为0。

compount条件是让我获得始终支付相同账单的独特用户ID。

STDEV可以用于同一组中的任意数量的行(查询可以使用超过两个月的数据正常工作)

SQLFiddle demo