1

言語、一意の ID、ファイル パスなど、多数のファイルに関するデータを格納するテーブルがあります。一意の ID からサブストリングを取得して、アセット タイプを取得できるようにしたいと考えています。これは次のとおりです。常に ID の最初の 2 文字です。次に、これらのアセット タイプを言語ごとにグループ化し、すべての言語が持つ各タイプの数を数えたいと考えています。したがって、最後に、言語の列と、各部分文字列 (資産の種類) の列を含むテーブルが理想的です。

大規模な switch ステートメントを作成しようとしましたが、これはあまり信頼できず、おそらく linq の方が優れていると言われました。私はlinqやsqlの経験があまりなく、私が試したSQLクエリがいくつかあり、それによって望ましい結果の一部が得られますが、経験豊富な人がこれらの関数をグループ化する方法を知っているかもしれないと思っていました1つのステートメントに。

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

これで正しい部分文字列が得られますが、言語ごとに複数の行があります。同じ言語を 1 つの列にグループ化し、各タイプの数を数える方法はありますか? ありがとう

現在のクエリからのサンプル データ 望ましい結果

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 に答える