1

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

我试图创建一个大的 switch 语句,但这不是很可靠,有人告诉我也许 linq 会更好。我对 linq 或 sql 没有太多经验,并且我尝试过几个 sql 查询,这些查询可以让我获得所需结果的一部分,但我希望也许有更多经验的人可能知道如何对这些功能进行分组成一个声明。

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

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

当前查询的样本数据 期望的结果

4

1 回答 1

1

听起来你想要 aCOUNT和 a GROUP 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)
于 2013-02-06T10:18:25.637 回答