Sql 如何在同一个表中找到相同的值而不在where子句中硬编码?
我的桌子看起来像这样:Sql 如何在同一个表中找到相同的值而不在where子句中硬编码?,sql,sql-server,Sql,Sql Server,我的桌子看起来像这样: User | Sale| Year ------------------------------- Kim | 2 | 2019 Kim | 2 | 2018 Kim | 1 | 2017 Tim | 3 | 2019 Tim | 2 | 2018 Tim | 1 | 2017 Jim | 4 | 2019 Jim | 3 | 2018 Jim | 3 | 2017 Name
User | Sale| Year
-------------------------------
Kim | 2 | 2019
Kim | 2 | 2018
Kim | 1 | 2017
Tim | 3 | 2019
Tim | 2 | 2018
Tim | 1 | 2017
Jim | 4 | 2019
Jim | 3 | 2018
Jim | 3 | 2017
Name | Current Year | Previous Years(Sum)
Kim | 2 | 3
Tim | 3 | 3
Jim | 4 | 6
表中有许多记录。
我想为每个用户添加过去几年的销售额
结果应该是这样的:
User | Sale| Year
-------------------------------
Kim | 2 | 2019
Kim | 2 | 2018
Kim | 1 | 2017
Tim | 3 | 2019
Tim | 2 | 2018
Tim | 1 | 2017
Jim | 4 | 2019
Jim | 3 | 2018
Jim | 3 | 2017
Name | Current Year | Previous Years(Sum)
Kim | 2 | 3
Tim | 3 | 3
Jim | 4 | 6
到目前为止我已经试过了,但没有成功
select
User,
Sale as CurrentYearSale,
sum(case when Year < 2019 then cast(Sale as int) end) as PreviousYearsSale
from
Test
where Year =2019
group by User,Sale;
您可以使用条件聚合:
select user,
sum(case when year = 2019 then sales end) as current_year,
sum(case when year < 2019 then sales end) as previous_years
from dummydata
group by user;
他是一把小提琴
如果不想硬编码年份,可以使用日期函数:
select user,
sum(case when year = year(getdate()) then sales end) as current_year,
sum(case when year < year(getdate()) then sales end) as previous_years
from dummydata
group by user;
尝试条件聚合,如下所示-
SELECT [User],
SUM(CASE WHEN [Year] = 2019 THEN Sale ELSE 0 END) C_year,
SUM(CASE WHEN [Year] < 2019 THEN Sale ELSE 0 END) P_year
FROM your_table
GROUP BY [User]
你可以查一下
您给定的查询也应该写在下面-
select [User],
sum(case when [Year] = 2019 then cast(Sale as int) ELSE 0 end) as CurrentYearSale,
sum(case when [Year] < 2019 then cast(Sale as int) ELSE 0 end) as PreviousYearsSale
from Test
--where Year =2019
-- As your are calculating sum for previous year
-- you do not need to filter data by Year = 2019
group by [User];
您可以检查查询的输出将条件聚合用作
SELECT UserName,
SUM(CASE WHEN Year = 2019 THEN Sales ELSE 0 END) CurrYear,
SUM(CASE WHEN Year < 2019 THEN Sales ELSE 0 END) PrevYears
FROM
(
VALUES
('Kim',2, 2019),
('Kim',2, 2018),
('Kim',1, 2017),
('Tim',3, 2019),
('Tim',2, 2018),
('Tim',1, 2017),
('Jim',4, 2019),
('Jim',3, 2018),
('Jim',3, 2017)
) T(UserName, Sales, Year)
GROUP BY UserName;
您可以尝试这样的透视表
--dummy data
CREATE TABLE sales
(
"user" varchar(10),
sales int,
"year" int,
)
drop table sales
INSERT INTO dbo.sales VALUES
('Kim',2, 2019),
('Kim',2, 2018),
('Kim',1, 2017),
('Tim',3, 2019),
('Tim',2, 2018),
('Tim',1, 2017),
('Jim',4, 2019),
('Jim',3, 2018),
('Jim',3, 2017)
------
--- query
select usr , current_year , previous_years
from
(
select "user" as usr , year,sum(sum_of_sales) as sum_of_sales
from
(
select "user" ,
case
when year = 2019 then 'current_year'
when year < 2019 then 'previous_years'
end as year ,
sum(sales) as sum_of_sales
from sales
group by "user" , year
) a
group by "user" ,year
) as SourceTable
pivot
(
sum(sum_of_sales)
FOR year IN ( current_year , previous_years)
) AS PivotTable;
结果
我在上一年得到空值,当当前年份为2019年时,我在上一年得到的这些记录中又得到了3条记录sales@shah . . . 这正是问题所要求的。我添加了一个数据小提琴。我没有得到预期的结果,对于上一年的销售,我得到了3个额外的结果records@shah,这将为您提供预期的输出。你能检查一下这里的db小提琴吗?你试过你收到的答案了吗?是的,我试过了,但没有得到想要的结果。我用query的结果更新了问题。当我使用我的实际表而不是值时,它对我不起作用