简体   繁体   English

SQL Server 2008 R2:VARCHAR 列上的数据透视表

[英]SQL Server 2008 R2: Pivot table on VARCHAR column

Table :

CREATE TABLE EMPDetails
(
    ID int,
    EmpName varchar(20),
    ColumnName varchar(20),
    ColumnValue varchar(20)
);

Records :记录

INSERT INTO EMPDetails Values(1,'S','Company','Microsoft');
INSERT INTO EMPDetails Values(1,'S','Profession','Database');
INSERT INTO EMPDetails Values(1,'S','Location','USA');
INSERT INTO EMPDetails Values(1,'S','Company','Unisys');
INSERT INTO EMPDetails Values(1,'S','Company','TATA');

INSERT INTO EMPDetails Values(2,'U','Company','Microsoft');
INSERT INTO EMPDetails Values(2,'U','Profession','Software');
INSERT INTO EMPDetails Values(2,'U','Location','UK');
INSERT INTO EMPDetails Values(2,'U','Company','DXC');
INSERT INTO EMPDetails Values(2,'U','Company','AOL');

INSERT INTO EMPDetails Values(3,'R','Company','Microsoft');
INSERT INTO EMPDetails Values(3,'R','Profession','Software');
INSERT INTO EMPDetails Values(3,'R','Location','UK');
INSERT INTO EMPDetails Values(3,'R','Company','AOL');

My try我的尝试

Condition 1 : Company = 'Microsoft' AND Profession = 'Database'条件 1Company = 'Microsoft' AND Profession = 'Database'

Expected Result:预期结果:

ID  EmpName Company     Profession  Location
-----------------------------------------
1   S       Microsoft   Database    USA

Query:询问:

SELECT *
FROM 
(
  SELECT ID, EmpName,ColumnValue, ColumnName
  FROM EMPDetails
) src
PIVOT
(
  MAX(ColumnValue) /*OR MIN()*/
  FOR ColumnName in ([Company], [Profession], [Location])
) piv
WHERE Company = 'Microsoft' AND Profession = 'Database'  

Condition 2 : Company = 'Microsoft' AND Profession = 'Software'条件 2Company = 'Microsoft' AND Profession = 'Software'

Expected Result:预期结果:

ID  EmpName Company     Profession  Location
-----------------------------------------
3   R       Microsoft   Software    UK
2   U       Microsoft   Software    UK

Query :询问 :

SELECT *
FROM 
(
  SELECT ID, EmpName,ColumnValue, ColumnName
  FROM EMPDetails
) src
PIVOT
(
  MAX(ColumnValue) /*OR MIN()*/
  FOR ColumnName in ([Company], [Profession], [Location])
) piv
WHERE Company = 'Microsoft' AND Profession = 'Software'

Question : If I use MIN() aggregate function with condition 1, then will get result but not with MAX() and it's reverse for condition 2. Why?问题:如果我在条件 1 下使用MIN()聚合函数,那么会得到结果,但不会使用MAX()而条件 2 则相反。为什么?

You can GROUP BY employee and use conditional counting in the HAVING clause, to get the employee that satisfies the criteria:您可以GROUP BY员工并在HAVING子句中使用条件计数,以获取满足条件的员工:

SELECT ID, EmpName      
FROM EMPDetails 
GROUP BY ID, EmpName
HAVING COUNT(CASE 
                WHEN ColumnName = 'Company' AND 
                     ColumnValue = 'Microsoft' THEN 1 
             END) > 0
       AND 
       COUNT(CASE 
                WHEN ColumnName = 'Profession' AND 
                ColumnValue = 'Database' THEN 1 
             END) > 0

The above query picks employees having Microsoft as a Company and Database as a Profession .上面的查询选择将Microsoft作为CompanyDatabase作为Profession员工。

Output:输出:

ID  EmpName
------------
1   S

You can now use conditional aggregation to pivot the employee rows:您现在可以使用条件聚合来透视员工行:

SELECT ID, EmpName,
       'Microsoft' AS Company,
       'Database' AS Profession,
       MAX(CASE WHEN ColumnName = 'Location' THEN ColumnValue END) AS Location
FROM EMPDetails 
GROUP BY ID, EmpName
HAVING COUNT(CASE 
                WHEN ColumnName = 'Company' AND 
                     ColumnValue = 'Microsoft' THEN 1 
             END) > 0
       AND 
       COUNT(CASE 
                WHEN ColumnName = 'Profession' AND 
                     ColumnValue = 'Database' THEN 1 
             END) > 0

There is no need to perform aggregation for the Company or the Profession value, as the desired value is guaranteed to belong to the employee group.不需要对 Company 或 Profession 值进行聚合,因为所需的值保证属于员工组。

Output:输出:

ID  EmpName Company     Profession  Location
-----------------------------------------
1   S       Microsoft   Database    USA

To get the second result set, you can simply replace Database by Software :要获得第二个结果集,您可以简单地用Software替换Database

SELECT ID, EmpName,
       'Microsoft' AS Company,
       'Software' AS Profession,
       MAX(CASE WHEN ColumnName = 'Location' THEN ColumnValue END) AS Location
FROM EMPDetails 
GROUP BY ID, EmpName
HAVING COUNT(CASE 
                WHEN ColumnName = 'Company' AND 
                     ColumnValue = 'Microsoft' THEN 1 
             END) > 0
       AND 
       COUNT(CASE 
                WHEN ColumnName = 'Profession' AND 
                     ColumnValue = 'Software' THEN 1 
             END) > 0

Output:输出:

ID  EmpName Company     Profession  Location
---------------------------------------------
3   R       Microsoft   Software    UK
2   U       Microsoft   Software    UK

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM