Нужна помощь по объединению данных в представление (SQL Server) - PullRequest
1 голос
/ 13 февраля 2012

view

Я новичок в использовании представлений, и я не совсем уверен, возможно ли то, что я хочу сделать, используя представление.

Первая таблица - это мой исходный файл данных, который я импортировал в 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

Это возвращает мне столбец с фруктами и столбец amount_from_us. Однако я заблудился о том, как получить дату и общую сумму там. Возможно ли это даже с помощью представлений или мне просто создать таблицу и использовать объединения?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2012

Попробуйте:

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]
1 голос
/ 13 февраля 2012
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
0 голосов
/ 13 февраля 2012

извините за мой первый ответ, теперь я понимаю, что вам нужно:

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

Я думаю, что это будет работать

0 голосов
/ 13 февраля 2012
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]
...