Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在同一个表中找到相同的值而不在where子句中硬编码?_Sql_Sql Server - Fatal编程技术网

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的结果更新了问题。当我使用我的实际表而不是值时,它对我不起作用