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