【问题标题】:SQL query - counting only the months that met certain conditionSQL 查询 - 仅计算满足特定条件的月份
【发布时间】:2020-05-02 11:23:00
【问题描述】:

我在编写 sql 查询时遇到了麻烦...基本上我有大约一百万行(卡片),交易分为列 - 月(12 个月)。

因此,每一行都显示了该卡每个月的交易量。 现在的问题是 - 我试图只选择一年中仅 7 个月满足特定条件的卡。

条件是每个月(持续 7 个月)他们花费超过 5 000 欧元。

我只是不知道什么功能可以显示 7 个月的结果。我已经写了整个查询,但是对于整年来说,现在我需要将其缩小到 7 个月,但是不知道怎么......我已经“谷歌”了。 重要 - 7 个月不需要连续 - 它可以是一年中的任何一个月。 有人可以帮我吗?

谢谢你,K。

【问题讨论】:

  • 请提供适当的样本数据和预期结果。另外,到目前为止,您尝试过什么?
  • 请添加示例数据和表结构以及到目前为止您尝试过的查询,以便我们提供帮助
  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。 Why should I tag my DBMS
  • 嗨,在我拥有的行中 - 卡片
  • 选择不同的卡总和(当日期在 '2019-01-01' 和 '2019-01-31' 和 tran_amount > '0' 然后 tran_amount 否则 '0' 结束的情况下)作为 leden, sum (当日期在 '2019-02-01' 和 '2019-02-28' 之间且 tran_amount > '0' 然后 tran_amount else '0' 结束时)作为 unor, . . . . . . (所有 12 个月)来自客户,日期为 2019-01-01' 和 '2019-12-31'

标签: sql


【解决方案1】:

您应该修复您的数据模型以将月份存储在行中,而不是在列中。

这是一个解决方案,它在子查询中使用union all 动态生成这样的结构,然后使用having 子句进行聚合和过滤:

select card
from (
    select card, month_1 spent from mytable
    union all select card, month_2 from mytable
    -- ... one "union all" statement per column ...
    union all select card, month_12 from mytable
) t
group by card
having sum(case when spent > 5000 then 1 end) = 7

假设数据结构如下:

card      -- primary key
month_1   -- amount spent during the 1stmonth
month_2   -- amount spent during the 2nd month
...
month_2   -- amount spent during the 12th month

【讨论】:

  • 应该是>= 7
  • @PanChristensen:也许吧。这在问题中并不那么清楚。 OP声明:只选择满足特定条件 7个月的卡,所以我选择了= 7。将条件调整到确切的要求是微不足道的。
猜你喜欢
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
相关资源
最近更新 更多