我正在使用SQL Server 2014,下面是我正在使用的数据库,需要对其进行一些分析。
仔细检查数据库样本后,我们可以在8777
和L9
列中看到一个数字L13
。
现在,我只想获取其中包含8777的那些列,最后是一个名为“ count”的列,该列显示数字出现的次数意味着我需要输出如下所示的内容:
到目前为止,我已经编写了此查询,该查询给出了正确的类别和子类别。但是它显示了所有列。我不知道如何计算数字的出现并在计数列中显示其计数。
select *
from Sheet2$
where '8777' IN ([L1],[L2],[L3],[L4],[L5],[L6],[L7],[L8],[L9],[L10],[L11],[L12],[L13]
答案 0 :(得分:2)
要动态限制列,您需要动态SQL
示例
Select *
Into #Temp
From YourTable A
Unpivot ( Value for Item in ([L1], [L2],[ L3], [L4], [L5], [L6], [L7], [L8], [L9], [L10], [L11], [L12], [L13]) ) u
Where Value = 8777
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Item) From #Temp Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select *,[Count] = sum(1) over()
From #Temp A
Pivot (max(Value) For [Item] in (' + @SQL + ') ) p'
Exec(@SQL);
返回
Category SubCategory L13 L9 Count
C1 SC1 NULL 8777 2
C1 SC3 8777 NULL 2
答案 1 :(得分:0)
嗯。我想您想要带有计数的原始行。我认为是这样:
declare @cols nvarchar(max);
declare @sql nvarchar(max);
set @cols = (select distinct ', ' + v.colname
from t cross apply
(values ('l1', l1),
('l2', l2),
('l3', l3),
('l4', l4),
('l5', l5),
('l6', l6),
('l7', l7),
('l8', l8),
('l9', l9),
('l10', l10),
('l11', l11),
('l12', l12),
('l13', l13)
) v(colname, val)
where v.val = '8777'
for xml path ('')
);
set @sql = '
select category, subcategory' + @cols + ',
count(*) over () as cnt
from t
';
exec sp_executesql @sql;
与结果的唯一区别是计数在每一行上。可以使用case
表达式轻松地进行调整,但是我不确定是否有必要。
如果您只想在一行中计数,那么:
set @sql = '
select category, subcategory' + @cols + ',
(case when row_number() over (order by category, subcategory) = 1
then count(*) over ()
end) as cnt
from t
order by category, subcategory
';
答案 2 :(得分:0)
您可以尝试用此部分代替John的第二个查询来获得正确的计数,它不能完全满足您的要求,但可以解决。
Declare @sql varchar(max) = Stuff((Select Distinct ',' + QuoteName(Item)
From #Temp Order by 1 For XML Path('')),1,1,'')
print @sql;
Select @SQL = '
Select *,value=8777
From #Temp A
Pivot (Count(Value) For [Item] in (' + @sql + ') ) p'
print @sql;
Exec(@SQL);
我只是在枢轴中使用了count函数来代替求和。