【问题标题】:Date specific calculation sql日期具体计算sql
【发布时间】:2014-05-02 19:22:37
【问题描述】:

使用 SQL 2008 r2 并在 excel 数据透视图中使用我的 Q 数据(快乐)!

所以我有一个查询给我这样的结果:(在许多其他结果中,但这是减去“噪音”的数据。所以我不能删除/过滤任何数据,只能在新列中添加):

    month  user  target   
    1      001    1000
    1      001    1000
    1      002    2000
    1      001    1000
    2      002    2000
    2      002    2000
    3      002    2000
    3      002    2000
    4      002    2000

我想要的应该是这样的:

    month  user  target  New col
    1      001    1000    1000
    1      001    1000       0
    1      002    2000    2000
    1      001    1000       0
    2      002    2000    2000
    2      001    2000    1000
    3      002    2000    2000
    3      002    2000       0
    3      002    2000       0
    3      001    2000    1000
    4      002    2000    2000
    4      001    1000    1000

所以基本上我希望每个用户的目标只显示新月份的第一个实例,然后在之后的每个月份显示“0”。此查询采用年度目标并将其除以 12 以达到每月水平。在我的示例中,用户 001 的目标金额将是“新列”而不是“目标”列的总和,因为在计算年度/12 时,它只是将该金额放在有用户记录的任何地方并总结该列远远超过实际目标。

也就是说,对于每个月,用户 001 的每月目标是 1000,而用户 002 的每月目标是 2000。这就是为什么我无法总结目标列的原因。

为什么我需要这种格式?因为这些数据正在与其他数据一起用于 excel 中的数据透视图中,我需要将其汇总并汇总为 excel 中的运行总计。所以我不想总结“目标列”而是“新列”,然后当我查看我的枢轴上的所有员工时,它汇总了这些员工的目标,当我深入到个人时,它只显示我那个人的目标。

这让我在网上搜索了好几天都没有乐趣。如果有人真的想提供帮助,但对我的要求/想要的东西感到困惑,我将在这里更新/编辑任何需要的东西。如果我能解决这个问题,那就太棒了!!!

【问题讨论】:

  • 如果“实例”是第一个,哪一列会告诉你?
  • 如果您的约束允许使用临时表,您可能会发现在 2 次或更多次传递中更容易:第一次传递 SELECT DISTINCT 月份、用户、目标,第二次传递以添加其他行,例如
  • 所以我在想 Row_Count() 或者我有一个独特的 col,我们可以调用 ROWID,它是增量的,也可以使用。我可以使用 with 't1' as(select.....) 形式的临时表
  • 我已经在 2 个 'tables' 中使用 'with as ()' 所以添加更多不是什么大问题,这只是我的代码只为所有用户而不是每个用户提供月份的第一个实例.
  • 类似这样的东西。 // first pass INSERT INTO temp_t1 SELECT month,user, target, 0 from <other> // we'll have one row too many when we add the row with the target, so remove one DELETE from temp_t1 where ROW_ID in (select Min(row_id) ... grouped by month,user.... // third pass : put in the row with the true target INSERT INTO temp_t1 SELECT DISTINCT month,user, target, target from <other>;

标签: sql excel sql-server-2008 pivot-table


【解决方案1】:

这符合你的追求吗?

CREATE TABLE [dbo].[Users](
[month] [int] NOT NULL,
[user] [int] NOT NULL,
[target] [int] NOT NULL
) ON [PRIMARY]

GO

DELETE FROM users

insert into users ([month], [user], [target]) values
(1,001,1000), (1,001,1000),(1,002,2000),(1,001,1000), (2,002,2000), (2,002,2000), 
(3,002, 2000), (3,002,2000), (4, 002, 2000);

With RowAdded AS (
SELECT ROW_NUMBER() OVER( Partition By [user],[month] order by [user]) AS RowNum,
U.*
FROM users U),

Targeted AS (
    SELECT
   RA.[month],
   RA.[user],
   CASE WHEN RowNum = 1 THEN [target]
    ELSE 0 END AS target
   FROM RowAdded RA)

SELECT * FROM Targeted

【讨论】:

  • 现在尝试一切。请耐心等待我把它翻译成我的作品 Q(我不能发布)
  • 当然,作为旁注,将 sql create 和 seed 语句添加到此类问题中会给您带来更好的结果,这样人们就可以轻松地帮助您,而不是费力地创建表,添加数据等。
  • 我想补充一点,我没有逐字记录,但是可以修改 select 语句中的内容以使其正常工作。我将使用我使用的代码稍微编辑此评论,但史蒂夫杰克逊,非常感谢你
  • 我使用的代码:with t1 as (.....), t2 as(...row_number() over (partition by C.User, C.Month, order by c.User ) as Y...) select ... case when Y = 1 then D.target else 0 end as 'test' from T1 C inner join T2 D on ......
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多