0

これが SQL 関数です。複雑で申し訳ありません。

SELECT [Codes].[Description], RawData.FS, COUNT(*)  As 'Total Units' 
FROM RawData, Codes, Categories  
WHERE RawData.ACR = Codes.Name
AND   Codes.CategoryName = 'ACR'
GROUP BY [Codes].[Description], [RawData].[FS]
ORDER BY [RawData].[FS]

説明には、各列のテーブル RawData で使用されるコードを含む Codes テーブルがあります。Categories という 2 番目のテーブルは、これらすべての列を追跡し、Codes.CategoryName は Categories.Name の FK です。基本的に、RawData のコード化された値ごとに 1 つのルックアップ テーブルを作成します。

フィールド RawData.FS には、NULL、1、2 の 3 つの値があります。RawData.ACR には、1 エーカー未満、1 ~ 10 エーカー、> 10 エーカーの記述に対応する 3 つの値があります。上記のクエリは正しい結果を返します

Description                          FS Total Units
House on less than one acre               57080
House on one to less than ten acres        4760
House on ten acres or more                  880

House on less than one acre           1   31496
House on one to less than ten acres   1    4312
House on ten acres or more            1     360

House on less than one acre           2  594404
House on one to less than ten acres   2   74688
House on ten acres or more            2    9104

ここでの課題は、SQL をやり直して、3 セットの 3 行ではなく、FS の値に対応する列になるようにすることです。つまり、ヘッダーは (最初の行の場合);

Description                        FS=NULL    FS=1      FS=2    
House on less than one acre         57080    31496    594404   

もう少しヘルプとして、カテゴリとコード構造を作成するための SQL を次に示します。

CREATE TABLE Categories (
 [Name] NVARCHAR(50) PRIMARY KEY,
 [Description] NVARCHAR(200) 
)

CREATE TABLE Codes (
 [Name] NVARCHAR(50),
 [CategoryName] NVARCHAR(50) FOREIGN KEY REFERENCES Categories(Name),
 [Description] NVARCHAR(200) ) 

RawData のすべてのフィールドはコード化されています (実際、データ ディクショナリはhttp://www.census.gov/acs/www/Downloads/data_documentation/pums/DataDict/PUMS_Data_Dictionary_2009-2011.pdfにあります)。これは、古典的な SQL パズルの 1 つです。

4

2 に答える 2

1

値を列にピボットする次のことをしたいようです:FS

SELECT [Codes].[Description], 
  sum(case when RawData.FS is null then 1 else 0 end) FS_null,
  sum(case when RawData.FS = 1 then 1 else 0 end) FS_1,
  sum(case when RawData.FS = 2 then 1 else 0 end) FS_2
FROM RawData
INNER JOIN Codes
  ON RawData.ACR = Codes.Name
INNER JOIN Categories  
  ON Codes.CategoryName = Categories.Name
WHERE Codes.CategoryName = 'ACR'
GROUP BY [Codes].[Description]
于 2013-02-04T22:07:15.013 に答える
0

テストされていませんが、ケースとサブセレクトが機能するようです。

Select description, 
case when fs is null then total_units end as 'FS=Null',
CASE WHEN fs = 1 then total_units end as 'FS=1',
case when fs = 2 then total_units end as 'FS=2'
FROM (
  SELECT [Codes].[Description], 
  RawData.FS, COUNT(*)  As 'Total_units' 
  FROM RawData, Codes, Categories  
  WHERE RawData.ACR = Codes.Name
  AND   Codes.CategoryName = 'ACR'
  GROUP BY [Codes].[Description])
ORDER BY description
于 2013-02-04T22:11:52.647 に答える