Sql server 如何将列值显示为行并将数据与其他表连接?

Sql server 如何将列值显示为行并将数据与其他表连接?,sql-server,Sql Server,我想根据列值对数据进行分类(将列值显示为行) 这就是我的桌子的样子 OfficeID | Emp Name | Department | Status -----------+----------+-------------+-------- Office_1 | Emp 1 | Marketing | Active Office_1 | Emp 2 | Marketing | Active Office_1 | Emp 3 | Marketing

我想根据列值对数据进行分类(将列值显示为行)

这就是我的桌子的样子

OfficeID   | Emp Name | Department  | Status
-----------+----------+-------------+--------
Office_1   |  Emp 1   | Marketing   | Active
Office_1   |  Emp 2   | Marketing   | Active
Office_1   |  Emp 3   | Marketing   | Non-Active
Office_2   |  Emp 4   | IT          | Active
Office_2   |  Emp 5   | Finance     | Active
Office_2   |  Emp 6   | Finance     | Non-Active
Office_2   |  Emp 7   | Finance     | Active
我希望结果集看起来像这样

OfficeName | MarketingExecutive | FinanceExecutive | ITexecutive
-----------+--------------------+------------------+--------------
Office A   |         2          |        0         |     0
Office B   |         0          |        2         |     1
我想给列名起一个别名

office值来自另一个表,该表与上面的表有主键/外键关系

officeID  | OfficeName
----------+-----------
Office_1  | Office A
Office_2  | Office B
更新:

这就是我迄今为止所尝试的

SELECT *
FROM
    (SELECT officeID,Department
     FROM EmpTable 
     WHERE Status = 'Active') AS SourceTable 
PIVOT
    (COUNT(Department) 
        FOR Department IN ([Marketing], [IT], [Finance])
    ) AS PivotTable;
我无法从另一个表(
officeID=>officeName
)获取值,也无法设置别名


另外,我很好奇,如果没有pivot,是否还有其他方法可以做到这一点?您需要表的联接、按officename分组和条件聚合:

select 
  t2.officename,
  sum(case when department = 'Marketing' and status = 'Active' then 1 else 0 end) MarketingExecutive, 
  sum(case when department = 'Finance' and status = 'Active' then 1 else 0 end) FinanceExecutive,
  sum(case when department = 'IT' and status = 'Active' then 1 else 0 end) ITExecutive
from table1 t1 inner join table2 t2
on t2.officeid = t1.officeid
group by t2.officename
或:

请参阅。
结果:

这就行了

CREATE TABLE #TBL (OfficeID VARCHAR(20),Emp_Name  VARCHAR(20), Department  VARCHAR(20), [Status]  VARCHAR(20))
INSERT INTO #TBL VALUES
('Office_1','Emp 1','Marketing','Active'),
('Office_1','Emp 2','Marketing','Active'),
('Office_1','Emp 3','Marketing','Non-Active'),
('Office_2','Emp 4','IT','Active'),
('Office_2','Emp 5','Finance','Active'),
('Office_2','Emp 6','Finance','Non-Active'),
('Office_2','Emp 7','Finance','Active') 

SELECT
CASE WHEN OfficeID='Office_1' THEN 'Office A'
     WHEN OfficeID='Office_2' THEN 'Office B' END AS OfficeName 
,SUM(CASE WHEN Department = 'Marketing' THEN 1 ELSE 0 END) AS MarketingExecutive 
,SUM(CASE WHEN Department = 'Finance' THEN 1 ELSE 0 END) AS FinanceExecutive
,SUM(CASE WHEN Department = 'IT' THEN 1 ELSE 0 END) AS ITexecutive

FROM #TBL
WHERE [Status] = 'Active'
GROUP BY CASE WHEN OfficeID='Office_1' THEN 'Office A'
     WHEN OfficeID='Office_2' THEN 'Office B' END

到目前为止你试过什么?您所追求的是一个
透视图
或交叉表。有100个这样的例子;你有没有看过他们中的任何一个?你怎么知道一个人是这个部门的主管,而他们所担任的职位却没有列出来?这看起来像是一个家庭作业。你应该试着自己写一些SQL;这就是你学习掌握这门语言的方法。我已经更新了问题,提到了我做过的部分,以及当前查询的问题是什么?我怀疑缺少一个连接到另一个表的
JOIN
,@juancarlosoropeza如果办公室没有任何“活动”状态,则此代码将不会在结果中返回它,因为
其中[status]=“Active”
@forpas是正确的。这不是你想要的吗?
> officename | MarketingExecutive | FinanceExecutive | ITExecutive
> :--------- | -----------------: | ---------------: | ----------:
> Office A   |                  2 |                0 |           0
> Office B   |                  0 |                2 |           1
SELECT *
FROM
    (SELECT officeID, OfficeName, Department
     FROM EmpTable 
     Join OtherTable   -- add join
       ON EmpTable.OfficeID = OtherTable.OfficeName
     WHERE Status = 'Active') AS SourceTable 
PIVOT
    (COUNT(Department) 
        FOR Department IN ([Marketing], [IT], [Finance])
    ) AS PivotTable;
CREATE TABLE #TBL (OfficeID VARCHAR(20),Emp_Name  VARCHAR(20), Department  VARCHAR(20), [Status]  VARCHAR(20))
INSERT INTO #TBL VALUES
('Office_1','Emp 1','Marketing','Active'),
('Office_1','Emp 2','Marketing','Active'),
('Office_1','Emp 3','Marketing','Non-Active'),
('Office_2','Emp 4','IT','Active'),
('Office_2','Emp 5','Finance','Active'),
('Office_2','Emp 6','Finance','Non-Active'),
('Office_2','Emp 7','Finance','Active') 

SELECT
CASE WHEN OfficeID='Office_1' THEN 'Office A'
     WHEN OfficeID='Office_2' THEN 'Office B' END AS OfficeName 
,SUM(CASE WHEN Department = 'Marketing' THEN 1 ELSE 0 END) AS MarketingExecutive 
,SUM(CASE WHEN Department = 'Finance' THEN 1 ELSE 0 END) AS FinanceExecutive
,SUM(CASE WHEN Department = 'IT' THEN 1 ELSE 0 END) AS ITexecutive

FROM #TBL
WHERE [Status] = 'Active'
GROUP BY CASE WHEN OfficeID='Office_1' THEN 'Office A'
     WHEN OfficeID='Office_2' THEN 'Office B' END