【问题标题】:How to convert column to row in sql without using pivot如何在不使用pivot的情况下将sql中的列转换为行
【发布时间】:2020-10-06 09:23:58
【问题描述】:

我被分配从两个表中获取所需格式的数据。

桌员:

StaffID | Staff Name
--------+-----------
 1      | John 
 2      | Jack

和TableLead

LeadID | LeadValue | LeadStaus | StaffID
-------+-----------+-----------+--------
  1    | 5000      | New       | 1
  2    | 8000      | Qualified | 1
  3    | 3000      | New       | 2

您会注意到StaffID 是一个引用TableStaff 的外键。

我必须用以下格式表示数据

StaffID | StaffName | NewLeadCount | QualifiedLeadCount 
--------+-----------+--------------+-------------------
1       | John      |  1           |   1
2       | Jack      |  1           |   0

到目前为止我尝试过的是:

SELECT 
    COUNT([LeadID ]) AS LdCount, 'New' AS StageName  
FROM 
    [dbo].[TableLead] 
WHERE
    [LeadStaus] = 'New' 
UNION 
SELECT 
    COUNT([LeadID ]) AS LdCount, 'Qualified' AS StageName 
FROM 
    [dbo].[TableLead] 
WHERE
    [LeadStaus] = 'Qualified ' 

任何 NULL 点都应替换为 0。谁能告诉我解决问题的正确方向?

【问题讨论】:

  • 如果您不想使用(限制性的)PIVOT 运算符,请改用条件聚合。
  • 您能否就上述问题提示我如何使用它?
  • 搜索“条件聚合”或“跨标签”;你会发现很多资源(包括在这个网站上)。 不要忘记在搜索词中也包含“SQL Server”。

标签: sql-server join pivot-table


【解决方案1】:

我会推荐条件聚合:

select s.staffid, s.staffname, 
    sum(case when l.leadstatus = 'New'       then 1 else 0 end) as newLeadCount,
    sum(case when l.leadstatus = 'Qualified' then 1 else 0 end) as qualifiedLeadCount
from TableStaff s
inner join TableLead l on l.staffid = s.staffid
group by s.staffid, s.staffname

【讨论】:

  • 感谢您的帮助。解决方案非常简单明了。当数据量很大时,使用条件聚合是否会出现任何性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多