从列中获取子字符串并执行groupBy和count

时间:2013-02-06 10:14:59

标签: sql sql-server group-by pivot substring

我有一个表存储有关大量文件的数据,例如他们的语言,唯一ID,文件路径等。我希望能够从唯一ID中获取子字符串,从而为我提供资产类型,这始终是ID的前2个字母。然后,我想按语言对这些资产类型进行分组,并计算每种语言的每种类型的数量。所以最后我理想地喜欢一个有一个语言列的表,然后是每个子字符串的列(资产类型)。

我试图创建一个大的switch语句,但这不是很可靠,我被告知也许linq会更好。我没有太多使用linq或sql的经验,我有几个sql查询我试过,这让我得到了预期结果的一部分,但我希望也许有经验丰富的人可能知道如何对这些函数进行分组在一个声明中。

SELECT 
  LCID,
  SUBSTRING(AssetID,1,2)  
FROM [table]

这让我得到了正确的子字符串,但每种语言都有多行。有没有办法将相同的语言分组到一列,然后计算每种类型的数量?感谢

sample data from current query desired results

1 个答案:

答案 0 :(得分:1)

听起来你想要COUNTGROUP BY

SELECT 
  SUBSTRING(AssetID,1,2), 
  COUNT(*) Total
FROM [table]
GROUP BY SUBSTRING(AssetID,1,2)

您没有指定哪个数据库,但如果您使用的是SQL Server且LCID语句中包含SELECT,那么您需要将其包含在GROUP BY子句中。

如果LCID值对于每一行都是唯一的,那么您将获得每个AssetID的多条记录,因为它会尝试将唯一值组合在一起。结果,我删除了LCID

如果它不是唯一的,那么您可以使用:

SELECT LCID, 
  SUBSTRING(AssetID,1,2), 
  COUNT(*) Total
FROM [table]
GROUP BY LCID, SUBSTRING(AssetID,1,2)

根据您所做的编辑,您需要PIVOT将数据从行转换为列。对于PIVOT,您将使用:

select LCID, HA, HT, HP, FH, FX
from
(
  SELECT LCID, 
    SUBSTRING(AssetID,1,2) AssetID
  FROM [table]
) src
pivot
(
  count(AssetID)
  for AssetID in (HA, HT, HP, FH, FX) -- place more values here
) piv

如果您想要转换为列的未知值,则需要使用与此类似的动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(SUBSTRING(AssetID,1,2)) 
                    from [table]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT LCID, ' + @cols + ' from 
             (
                SELECT LCID, 
                  SUBSTRING(AssetID,1,2) AssetID
                FROM [table]
            ) x
            pivot 
            (
                count(AssetID)
                for AssetID in (' + @cols + ')
            ) p '

execute(@query)