在将数据聚合到视图中需要帮助 (SQL Server)

Posted

技术标签:

【中文标题】在将数据聚合到视图中需要帮助 (SQL Server)【英文标题】:Need help on aggregating data into a view (SQL Server) 【发布时间】:2012-02-13 17:14:07 【问题描述】:

我是使用视图的新手,我不确定我想要做的事情是否可以使用视图。

第一个表是我已导入 SQL 的原始数据文件。 我创建了一个仅包含fruit 和amount_from_us 列的视图,但我无法弄清楚如何在其中包含金额。通常,我会使用 where 子句,但我不知道如何在选择其他数据的同时做到这一点。

这是我目前所拥有的:

CREATE VIEW fruit_summary AS
SELECT fruit
, SUM(amount) AS amount
FROM original_table
WHERE bought_from_us = 'yes'
GROUP BY fruit

这让我得到了fruit 列和amount_from_us 列。然而,我不知道如何在那里获取日期和总金额。这甚至可以使用视图还是我应该只创建一个表并使用连接?

【问题讨论】:

您能否详细说明您的预期结果是什么以及您得到的列是什么...问候 我的预期结果是右边的表格,其中只有每天每种水果的实例,总量和来自我们的总量。 请在下面检查我的答案,我希望它会起作用......问候 【参考方案1】:

试试:

SELECT fruit, 
       [date], 
       SUM(amount) AS amount, 
       SUM(case when bought_from_us = 'yes' then amount else 0 end)
                   AS amount_from_us
FROM original_table
GROUP BY fruit, [date]

【讨论】:

谢谢!我喜欢这个答案的简单性。它完全符合我的要求。 @eek142 - 它是否为您提供 Jan-17 Banana 0 0 的最后一条记录? 哦,很好。它没有给我“Banana,0,0”,但现在,我可以忍受。实际上,我会认为缺少的任何东西都是零,因为该项目当天没有销售记录。【参考方案2】:
create table #original_table
(
    [date] datetime,
    fruit varchar(50),
    amount money,
    bought_from_us char(3)
)

insert #original_table([date], fruit, amount, bought_from_us)
values ('01/18/2012', 'Apple', 10, 0);
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/18/2012', 'Apple', 25, 'yes');
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/18/2012', 'Orange', 32, 0);
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/18/2012', 'Banana', 8, 0);
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/18/2012', 'Banana', 235, 'yes');
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/17/2012', 'Apple', 65, 0);
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/17/2012', 'Apple', 4, 'yes');
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/17/2012', 'Orange', 56, 0);
insert #original_table([date], fruit, amount, bought_from_us)
values ('01/17/2012', 'Orange', 95, 0);

您在结果中要求的内容非常复杂。要获得最后一条记录,Jan-17 Banana 0 0,你需要这样的东西:

with date_fruit_table as
(
    select date_table.[date], fruit_table.fruit
    from
        (select distinct fruit from #original_table) as fruit_table,
        (select distinct [date] from #original_table) as date_table
)

select date_fruit_table.[date], date_fruit_table.fruit,
    SUM(isnull(#original_table.amount, 0)) as amount,
    SUM(case #original_table.bought_from_us when 'yes' then #original_table.amount else 0 end) as amount_from_us
from date_fruit_table
left outer join #original_table on #original_table.fruit = date_fruit_table.fruit
    and #original_table.[date] = date_fruit_table.[date]
group by date_fruit_table.[date], date_fruit_table.fruit
order by date_fruit_table.[date] desc

【讨论】:

谢谢!我会调查一下。【参考方案3】:
SELECT fruit
, SUM(amount) AS amount
, SUM(amount_from_us) AS amount_from_us
, [Date]
FROM original_table
WHERE bought_from_us = 'yes'
GROUP BY fruit, [Date]

【讨论】:

很遗憾,这不起作用,因为 amount_from_us 中没有数值。它基本上只是一个布尔值。 你提问题的时候有没有描述过它的dayatype!!!!!!!打-1是不公平的。阅读您回答我的内容,“我的预期结果是右边的表格,其中只有每天每种水果的实例以及总量和来自我们的总量”。 那个-1不是我写的。我永远不会对试图提供帮助的人投反对票。无论如何,我实际上还没有足够的代表来投反对票。【参考方案4】:

对不起我的第一个答案,现在我知道你需要什么了:

with CTE_fruit as (
SELECT fruit, date, SUM(amount) AS amount, NULL AS amountUS
FROM original_table
GROUP BY fruit, date
union
SELECT fruit, date, NULL AS amount, SUM(amount) AS amountUS
FROM original_table
WHERE bought_from_us = 'yes'
GROUP BY fruit, date
)
select fruit, date, sum(amount), sum(amountUS) from CTE_fruit
GROUP BY fruit, date

我认为这会奏效

【讨论】:

以上是关于在将数据聚合到视图中需要帮助 (SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

在将约束应用于 UIScrollView 时需要帮助

需要帮助以在将条形码扫描到 Adob​​e 表单时自动从条形码中删除数据标识符

Access 视图创建询问

sql serve数据库中对in查询到的数据排序

在将数据从 tableView 传递到另一个 viewController Swift 时需要帮助。查看其他示例后继续出错

T-SQL:创建四个连接表的聚合视图的有效方法(每个项目的每个审计类型的最大审计条目)