从列获取子和执行GROUPBY和计数(Get a substring from a column a

2019-08-16 18:44发布

我有一个存储有关的大量文件,比如他们的语言,独特的ID,文件路径等。我希望能够得到的唯一ID使我有资产类型的子串数据的表,这是总是第2个字母的ID。 那么我想按语言这些资产类型和有多少每种类型的每一种语言都有的计数。 所以在最后我会像理想,有一个语言列,然后对每个子(资产类型)列的表。

我试图创建一个大的switch语句,但这不是非常可靠,有人告诉我,也许LINQ的效果会更好。 我没有使用LINQ或SQL很多经验,我有一对夫妇的SQL查询我已经试过了让我所期望的结果的一部分,但我希望也许有人谁拥有更多的经验可能知道如何分组这些功能到一个语句。

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

这让我正确的子串,但我必须为每种语言多行。 有什么办法来组相同的语言成一列,然后怎么算每种类型的有? 谢谢

Answer 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)


文章来源: Get a substring from a column and perform a groupBy and count