【问题标题】:SQL query in one command [closed]一个命令中的 SQL 查询[关闭]
【发布时间】:2018-08-26 21:25:42
【问题描述】:

两张桌子:
第一个表名:employee_1 |第二个表名:employee_2

code | Name | Salary | Month|Year    code | Name | Salary |Post |Month |Year
-----+------+--------+------+--      -----+------+--------+-----+------+----
1    | A    |   1000 | May  | 2017    1   | A    | 2000   |clerk|April |2017
2    | B    |   1150 | May  | 2017    2   | B    | 3000   |clerk|April |2017
1    | A    |   1200 | June | 2017
2    | B    |   1150 | June | 2017
1    | A    |   4000 | July | 2017
2    | B    |   3500 | July | 2017

year=2017 的输出应该是这样的:

code  | Name |April | May  | June  | July
------+------+------+-------+------+-
 1    | A    |2000  | 1000 | 1200  | 4000
 2    | B    |3000  | 1150 | 1150  | 3500

【问题讨论】:

  • 提示:GROUP BY.
  • 谷歌“SQL 数据透视查询”。顺便说一句,在现实世界中,除了月份之外,您几乎可以肯定还有年份。

标签: sql sql-server tsql pivot


【解决方案1】:

我不确定您是否可以在一个命令中为输出编写 SQL 查询,因为您希望将行(月)更改为列。因此,理想的解决方案是编写数据透视查询。

您可以使用 PIVOT 函数将数据从行转换为列。

如果月份未知或动态更改,听起来您将需要使用动态 SQL。

create table employee (code int , name varchar(100), salary money, Month1 varchar(100));


INSERT INTO employee (code, name, salary, Month1)
VALUES
(1   ,   'A'   ,    1000   ,   'may'),
(2   ,   'B'   ,    1150   ,   'may'),
(1   ,   'A'   ,    1200   ,   'June'),
(2   ,   'B'   ,    1150   ,   'June'),
(1    ,  'A'    ,   4000  ,    'July'),
(2    ,  'B'     ,  3500  ,    'July')

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Month1) 
                    from employee
                    group by Month1
                    order by Month1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

        select @cols

set @query = 'SELECT code,name,' + @cols + ' from 
             (
                select code, name, salary,Month1
                from employee
            ) x
            pivot 
            (
                sum(salary)
                for month1 in (' + @cols + ')
            ) p '

execute (@query)

#With Year as required in comment

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @year As varchar(100)

select @cols = STUFF((SELECT ',' + QUOTENAME(Month1) 
                    from employee1
                    group by Month1
                    order by Month1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @year = '2018'

set @query = 'SELECT code,name,' + @cols + ' from 
             (
                select code, name, salary,Month1,year
                from employee1
            ) x
            pivot 
            (
                sum(salary)
                for month1 in (' + @cols + ')
            ) p  where year ='+ @year +''

execute (@query)

关于两个表

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @year As varchar(100),
    @cols1 as varchar(1000),
    @cols2 as varchar(1000)

select @cols = STUFF((SELECT ',' + QUOTENAME(Month1) 
                    from employee1
                    group by Month1
                    order by Month1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @cols1 = STUFF((SELECT ',' + QUOTENAME(Month) 
                    from employee2
                    group by Month
                    order by Month
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @cols2 = @cols1 +',' + @cols


set @year = '2017'

set @query = 'SELECT code,name,' + @cols2 + ' from 
             (
                select code, name, salary,Month1,year
                from employee1 
                union all
                select code,name,salary,Month,year from employee2
            ) x
            pivot 
            (
                sum(salary)
                for month1 in (' + @cols2 + ')
            ) p  where year ='+ @year +''

execute (@query)

【讨论】:

  • 您要添加一个名为 year 的新列还是将现有月份与“2017 年 5 月”之类的年份连接起来
  • 为什么有另一个表 ABC 与 PQR 相比多了一个列。该表是否应与 pqr 连接以获得您的结果。我已经编写了一个动态 SQL,因此如果您的表中有 4 月份的数据,那么我假设将旋转一个名为“April”的新列,并将其显示在输出中。在这种情况下,您在尝试时是否遇到任何问题。
  • 男人!你太棒了,非常感谢你!!!!!!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2014-07-16
  • 2020-07-20
相关资源
最近更新 更多