How to export Excel worksheets to database with SQL statement file.

When you’d like to register Excel worksheets in database, you could ‘BULK INSERT’ txt file into database. In this article, I’d like to explain VBA code that exports Excel worksheets to sql file. It’s assumed that worksheet name is same as table name and first column order is same as table attribute order.

Option Explicit

Sub EXPORT_SQL()
    Dim mySht   As Worksheet
    Dim myAr    As Variant
    Dim i       As Long
    Dim j       As Long
    Dim mySQL   As String
    Dim SQLAr() As String
    Dim myFSO   As Object
    Dim myTS    As Object
    Dim myPath  As String
    Dim n       As Long
    myPath = ThisWorkbook.Path
    For Each mySht In Worksheets
        myAr = mySht.UsedRange.Resize(mySht.UsedRange.Rows.Count - 1).Offset(1)
        ReDim SQLAr(LBound(myAr) To UBound(myAr))
        For i = LBound(myAr) To UBound(myAr)
            For j = LBound(myAr, 2) To UBound(myAr, 2)
                If myAr(i, j) = Empty Then
                    mySQL = mySQL & "NULL, "
                Else
                    mySQL = mySQL & "'" & myAr(i, j) & "', "
                End If
            Next j
            mySQL = "INSERT INTO " & mySht.Name & " VALUES (" & Left(mySQL, Len(mySQL) - 2) & ")"
            SQLAr(i) = mySQL
            mySQL = ""
        Next i
        Set myFSO = CreateObject("Scripting.FileSystemObject")
        Set myTS = myFSO.CreateTextFile(Filename:=myPath & "\" & mySht.Name & ".sql", Overwrite:=True)
        For n = LBound(SQLAr) To UBound(SQLAr)
            myTS.writeline SQLAr(n)
        Next n
        myTS.Close
        Set myFSO = Nothing
        Set myTS = Nothing
    Next mySht
End Sub

EXCELのワークシートをテーブルに挿入するSQLステートメントファイルを作成するVBAコード

 Excel のワークシートをデータベースに登録するにはいくつかの方法があります.txt ファイルを BULK INSERT する方法もありますが,今回はワークシートのセル内容を INSERT するクエリを sql ファイルに書き出す VBA コードを説明します.ワークシート名はテーブル名と同じになっており,ワークシートの1行目はテーブルの属性名と同一の順番になっているとの前提で話を進めます.Excel のファイルと同一場所に sql ファイルがシートの数だけ作成されます.

Option Explicit

Sub EXPORT_SQL()
    Dim mySht   As Worksheet
    Dim myAr    As Variant
    Dim i       As Long
    Dim j       As Long
    Dim mySQL   As String
    Dim SQLAr() As String
    Dim myFSO   As Object
    Dim myTS    As Object
    Dim myPath  As String
    Dim n       As Long
    myPath = ThisWorkbook.Path
    For Each mySht In Worksheets
        myAr = mySht.UsedRange.Resize(mySht.UsedRange.Rows.Count - 1).Offset(1)
        ReDim SQLAr(LBound(myAr) To UBound(myAr))
        For i = LBound(myAr) To UBound(myAr)
            For j = LBound(myAr, 2) To UBound(myAr, 2)
                If myAr(i, j) = Empty Then
                    mySQL = mySQL & "NULL, "
                Else
                    mySQL = mySQL & "'" & myAr(i, j) & "', "
                End If
            Next j
            mySQL = "INSERT INTO " & mySht.Name & " VALUES (" & Left(mySQL, Len(mySQL) - 2) & ")"
            SQLAr(i) = mySQL
            mySQL = ""
        Next i
        Set myFSO = CreateObject("Scripting.FileSystemObject")
        Set myTS = myFSO.CreateTextFile(Filename:=myPath & "\" & mySht.Name & ".sql", Overwrite:=True)
        For n = LBound(SQLAr) To UBound(SQLAr)
            myTS.writeline SQLAr(n)
        Next n
        myTS.Close
        Set myFSO = Nothing
        Set myTS = Nothing
    Next mySht
End Sub

Food Composition Tables in the World

In this article, I’d like to introduce food composition tables in the world with on-line web-site. I’m happy if you share more information about other site with me.

  • Northern Europe
    • Finland
    • Norway
    • Sweden
  • Western Europe
    • Belgium
    • Denmark
    • Netherlands
    • France
    • Germany
    • Switzerland
    • Iceland
    • United Kingdom
  • Eastern Europe
    • Czech Republic
    • Estonia
    • Poland
    • Serbia
    • Slovakia
  • Southern Europe
    • Greece
    • Italy
    • Portugal
    • Spain
  • Middle East, Africa
    • Bahrain
    • Israel
    • Middle/Near East
    • Mozambique
    • South Africa
    • Turkey
    • West Africa
  • North America, South America
    • Canada
    • USA
    • Brazil
    • Latin America
  • Oceania
    • Australia
    • New Zealand
    • Pacific Islands
  • Asia
    • China
    • Malaysia
    • Singapore
    • Japan
    • Thailand
    • Vietnam

Finland

THL

Foods greater than 3400, 54 components. I couldn’t download data file. Rich link forward other country’s food composition tables.

Norway

The Norwegian Food Composition Table

13 food groups, 1305 foods and 36 components. It’s available for download.

Sweden

NFA Food Composition Database

Click “Search nutrient content in food” button below page, click icon of EXCEL and you can download csv file. Great!

Belgium

NUBEL

1200 foods and 32 components. You need to pay for data.

Denmark

Danish Food Composition Databank

You can download all data with Microsoft Access 2000 or Microsoft EXCEL version 5.0.

Netherlands

NEVO online

Or they would post you EXCEL file with all data if you send form from Request dataset.

France

French food composition table Table Ciqual 2012

You can download from this site csv file or mdb file.

Germany

MRI

Approximately 10,000 foods and 137 components. Read license agreement. Or you can use the Souci Fachmann Kraut Online Database. 800 foods and 260 components. Trial period is 30 days.

Switzerland

Swiss Food Composition Database

13 food groups, 1109 foods and 38 components. Click “Downloads” in left column to download xlsx file.

Iceland

ISGEM

The food composition table of Iceland, provided by MATÍS, seems to be similar to Japanese Food Composition Table. Provided PDF files for each food groups, with protection by password security, respectively. It seems to be 17 food groups.

Or you can purchase at EuroFIR with 15 euros if you visit University College Cork.

United Kingdom

McCance and Widdowson’s The Composition of Foods integrated dataset

Click “Related links” in the middle of page and you can download EXCEL file with 11 MB size and 16 sheets. 13 food groups and 3423 foods.

Czech Republic

Czech Food Composition Database, Version 2.11

13 food groups. You can’t download data file, but reference list is substantial. For example, “McCance and Widdowson’s The Composition of Foods integrated dataset (CoF IDS)” of UK, or “the Ciqual 2012 Table” of France.

Estonia

NutriData – Estonian food composition database

 72 foods and 59 components.

Poland

National Food and Nutrition Institute

Click orange link in right column. 3 steps access level, you need to pay for all 932 foods data and they post EXCEL file in CD-ROM!

Serbia

Department of Nutritional Research (DNR)

You seem to need to log-in and search with Serbia food composition table. But I couldn’t find registration form.

Slovakia

Slovak Food Composition Data Bank (SFCDB)

1419 foods and 52 components.

Greece

COMPOSITION TABLES OF FOODS AND GREEK DISHES

It’s amusing to view Greece food composition table. Instead of citing in the references like Finland, it’s described that they have referred to UK food composition table on site top.

Italy

Tabelle di composizione degli alimenti

Food composition table of Italy has 935 foods, 70 % of them is cited from Europian Institute of Oncology, 30 % is independent survey. GO to Data Search/By Food Group in left column, then you can view all data. Published in 1998 and 2008.

Portugal

TABELA DA COMPOSIÇÃO DE ALIMENTOS

14 food groups and 962 foods. I couldn’t download all data.

Spain

Base de Datos Española de Composición de Alimentos

I have been warned on above page by Google Chrome that security certificate is not trusted. You can enter from “Consulta/Query” on right above the page. 13 food groups, 998 foods and 43 components. I couldn’t download all data.

Bahrain

FOOD COMPOSITON TABLES FOR BAHRAIN

15 food groups and 34 components.

Israel

Ben Gurion University of the Negev

Ben Gurion University of the Negev provides service with simple interface. When you have downloaded “BGU recipe program”, mdb file of Microsoft Access, you could enter recipe in Hebrew and English.

Middle/Near East

food composition tables for the near east

14 food groups, 848 foods and 20 components.

Mozambique

Nutrition research in Mozambique

12 food groups, 410 foods and 35 components. You can download PDF file.

South Africa

South African Medical Research Council

Food composition table of South Africa has tangled link. 4th paragraph of analytical and bibliographic databases, South African Food composition database or Advanced Food composition database is target page. It seems that it had been available for download all data previously, but was not available recently.

Turkey

Turkish Food Composition Database

Turkish food composition database is beta version.

West Africa

Composition of Selected Foods from West Africa

It’s available for download PDF file with 13 food groups and 30 components.

Canada

Canadian Nutrient File (CNF), 2010

Canadian site is intelligent. It’s available for download data file and data structure is clear on the site, it seems to be easy to construct relational database.

USA

the Nutrient Data Laboratory

You can download food composition table of USA as Windows application. If you needed other type file, you could download from USDA National Nutrient Database for Standard Reference with 8.6 MB ASCII file or 21 MB Access file. ASCII file is compressed in zip format with text files and a PDF document, which describes file format and data structure after p26.

Brazil

Tabela de Brasileira de Composição de Alimentos

Food composition table of Brazil provides 1205 foods. It seems that you can’t download data file.

Latin America

Red Latinoamericana de Composición de Alimentos

17 food groups, 443 foods and 24 components. You can’t download data file, but you can view all data on site. This site has links to other Latin America countries.

Australia

NUTTAB 2010

Food composition table of Australia is easy to use and view all data, 19 food groups, 2190 foods and 196 components, with web browser. You can’t download data. You need to register.

New Zealand

New Zealand Food Composition Data for Nutrition Information Panel (NZFCD-NIP)

2700 foods and 7 major components. Windows application is available. It seems that you need to register.

Pacific Islands

The Pacific Islands food composition tables

20 food groups, 882 foods and 22 components. The table is available for download or viewing.

China

China Food Nutrition Network

22 food groups and 14 components. It’s heavy site and mainly written in Chinese.

Malaysia

Malaysian Foods Composition Database; //www.nutriweb.org.my/searchfood.php

Link to food composition table of Malaysia is broken.

Singapore

What’s Eating Singapore

Site of Health Promotion Board is advanced. There are 4 tools on “Health tools” at lower right corner of the page. Energy and Nutrient Composition of Food provides components of each food, Recipe Analysis calculates components of each dish and Food Intake Assessment assess weekly intake from your gender, age and body weight. It’s surprising that they have released smart phone application, BuUuk.

Japan

Report of the Subdivision on Resources The Council for Science and Technology Ministry of Education, Culture, sports, Science and Technology, JAPAN

18 food groups, 1878 foods and 50 components. It’s very difficult to use and convert to database. If you’d like to use immediately, it’s available in my blog, CSV file of the ‘Standard Tables of Food Composition in Japan 2010′.

Thailand

BUREAU OF NUTRITION

In Thailand, they seem to be sensitive to lack of iodine. They have food composition table about 13 food groups and usual 18 components, fatty acid and cholesterol and amino acid.

Vietnam

VIETNAMESE FOOD COMPOSITION TABLE

14 food groups, 526 foods and 86 components.

References:
Food composition databases
National Diet Library of Japan
DTU Food
International food composition table/database directory

世界の食品成分表

オンラインで検索できる世界各国の食品成分表のサイトです.この他にもあると思われますので,ご存知のかたはお知らせいただければ幸いです.



  • 北欧
    • フィンランド
    • ノルウェー
    • スウェーデン
  • 西欧
    • ベルギー
    • デンマーク
    • オランダ
    • フランス
    • ドイツ
    • スイス
    • アイスランド
    • イギリス
  • 東欧
    • チェコ
    • エストニア
    • ポーランド
    • セルビア
    • スロバキア
  • 南欧
    • ギリシャ
    • イタリア
    • ポルトガル
    • スペイン
  • 中東・アフリカ
    • バーレーン
    • イスラエル
    • 中近東
    • モザンビーク
    • 南アフリカ
    • トルコ
    • 西アフリカ
  • 北米・南米
    • カナダ
    • アメリカ
    • ブラジル
    • ラテンアメリカ
  • オセアニア
    • オーストラリア
    • ニュージーランド
    • 太平洋諸島
  • アジア
    • 中国
    • マレーシア
    • シンガポール
    • 日本
    • タイ
    • ベトナム



フィンランド

THL

フィンランドの食品成分表は3400以上の食品,54種類の栄養素について網羅してあります.日本食品標準成分表は1800種類ですから,数では負けています.残念ながら全データのダウンロードは出来ないようですが,他の国の食品成分表へのリンクが充実しています.

ノルウェー

The Norwegian Food Composition Table

リンクを更新しました.13食品群,1305食品,36成分について提供します.ダウンロード可能です.

スウェーデン

NFA Food Composition Database

スウェーデンの食品成分表は太っ腹です.ページ下部の”Search nutrient content in food”ボタンから入り,ページ右上のEXCELのアイコンをクリックするとcsvファイルがダウンロード出来ます.

ベルギー

NUBEL

1200の食品数,32の栄養素について.全データを入手するには有料のようです.

デンマーク

Danish Food Composition Databank

デンマークのサイトからも全データのダウンロードが可能です.Microsoft Access 2000 形式と,Microsoft Excel v5.0 形式のデータがあります.

オランダ

オランダの食品成分表はNEVO onlineというデータベースから見られます.またはRequest datasetからフォーム送信すると,全データの入ったEXCELのファイルが無料で送付されるようです.但しオランダ語です.

フランス

French food composition table Table Ciqual 2012

フランスの食品成分表はここからcsv形式とmdb形式でダウンロード出来るようになっています.当然ながら,フランス語で書かれています.

ドイツ

MRI

旧西ドイツの食品成分表はフィンランドをはるかに凌ぐ10000近い食品について137栄養素についてデータベース化してあります.生真面目な国民性を反映してか,ここを見る限り自由に利用出来るわけではなさそうで,登録制のようです.ページ最下部からダウンロード出来るPDFにライセンス料金が記載されています.

もうひとつはこちら.800種類の食品の260成分についてのデータベースです.30日間のトライアル期間が設けられています.

スイス

Swiss Food Composition Database

スイスの食品成分表のページの雰囲気は独特です.13の食品群,1109の食品の38の栄養素について提供されます.左カラムに小さく”Downloads“とあり,クリックすると.xlsx形式のファイルをダウンロード出来ます.

アイスランド

ISGEM

アイスランドのMATÍSの食品成分表は日本のそれとよく似ています.食品群ごとにPDFファイルで提供されているところから,プロパティのセキュリティでパスワードロックがかかっていてそのままではコピー出来ないところまで一緒です.提供されているファイル数からは食品群は17に分類されているようです.

もう一つのUniversity College Corkのサイトでは EuroFIRのサイトで買ってねとリンクが貼られているだけです.15ユーロですし,必要な方は購入されてもいいのではないでしょうか.

イギリス

McCance and Widdowson’s The Composition of Foods integrated dataset

イギリスの食品成分表はこのページ中段に”Related links”という章があり,EXCELのファイルでダウンロード出来ます.サイズは11MBもあり16枚のシートから成ります.13の食品群,3423の食品について提供されます.

チェコ

Czech Food Composition Database, Version 2.11

チェコの食品成分表の食品群は13群に分類されています.直接全データをダウンロードはできないのですが,参考文献リストが充実しています.リンクをたどると,イギリスの食品成分表とか,フランスの食品成分表などが出てきます.

エストニア

NutriData – Estonian food composition database

食品数72,59成分について.少ないなあというのが正直な感想です.

ポーランド

National Food and Nutrition Institute

ポーランドの食品成分表は上記ページの右カラムのオレンジ色のFood Composition Data Baseにリンクがあります.3段階のアクセスレベルが設定されていて,932の食品の全データを見るには有料でしかもCD-ROMに収められたEXCELファイルが郵送で送られて来るそうです.

セルビア

Department of Nutritional Research (DNR)

セルビアの食品成分表はログインしてから検索する形式ですが,どうも登録フォームが見当たらず,よく分からないというのが現状です.

スロバキア

Slovak Food Composition Data Bank (SFCDB)

スロバキアの食品成分表は1419の食品の52の成分について提供しています.

ギリシャ

COMPOSITION TABLES OF FOODS AND GREEK DISHES

ギリシャの食品成分表は色々と面白いですね.フィンランドみたいに参考文献の形で引用したとかではなく,イギリスの食品成分表から丸パクりしたと恥ずかしげもなくサイトトップに書いてあります.まあ正直というか,国民性でしょうか.色々想像させられます.3章に分かれており,2章と3章はさすがに自国の伝統料理や日常料理の栄養成分が表記してあります.

イタリア

Tabelle di composizione degli alimenti

イタリアの食品成分表は935種類の食品について調査してありますが,7割がEuropian Institute of Oncologyから引用しており,3割が自前で調査したデータです.全部自前で調べるのではなく,使えるものは使うというスタンスがイタリア人らしいというか何というか.左カラムの/Data Search/By Food Group と進むと全食品のデータが見られます.1998年と2008年の2回刊行されています.

ポルトガル

TABELA DA COMPOSIÇÃO DE ALIMENTOS

ポルトガルの食品成分表は14の食品群,962の食品の42の成分について提供されますが,どうも全データを一括ダウンロードはできないようです.

スペイン

Base de Datos Española de Composición de Alimentos

セキュリティ証明書が信頼出来ないとGoogle Chromeに警告されるページです.こちらから直接入ればよいでしょう.ページ右上の”Consulta/Query”から入れます.13の食品群,998食品の43成分について提供されますが,全データダウンロードは無理のようです.

バーレーン

FOOD COMPOSITON TABLES FOR BAHRAIN

15食品群,34成分について提供します.

イスラエル

Ben Gurion University of the Negev

ベングリオン大学の提供しているサービスです.随分と殺風景なインターフェースですが,ダウンロードしたアクセスのmdbファイルでレシピを入力すると栄養成分が表示されるようになっており,ヘブライ語と英語で入力できるようになっています.

中近東

food composition tables for the near east

14食品群,848食品,20成分について提供します.

モザンビーク

Nutrition research in Mozambique

モザンビークの食品成分表は12食品群,410食品の35成分について提供しています.PDFファイルをダウンロード出来ます.

南アフリカ

South African Medical Research Council

南アフリカの食品成分表はリンクが長く,ややこしいです.このページの4つ目のSouth African Food composition databaseAdvanced Food composition databaseへリンクを辿るのが良いでしょう.以前は全データが閲覧できたようですが,このフォームからは全データ一括ダウンロードは無理のようです.

トルコ

Turkish Food Composition Database (beta version)

トルコの食品成分表はベータ版です.完成を待ちましょう.

西アフリカ

Composition of Selected Foods from West Africa

西アフリカの食品成分表はPDFファイルでダウンロード可能です.13の食品群,30成分について提供します.

カナダ

Canadian Nutrient File (CNF), 2010

カナダのサイトは充実しています.データファイルを自由にダウンロードでき,かつ各テーブルのデータ構造がサイト上で説明してあるため,これに従ってリレーショナルデータベース化が可能と思われます.

アメリカ

the Nutrient Data Laboratory

アメリカの食品成分表はWindowsアプリケーションをダウンロードさせる形式です.生のデータが欲しい場合はこちらからどうぞ.ASCII形式で8.6MB,Access形式で21MBあります.ダウンロードしたファイルは.zip形式で圧縮されており,フォルダを開くと複数のテキストファイル,pdfファイルが一つあります.pdfはドキュメントであり,p26以降には各ファイルの定義およびデータ構造が記されています.

ブラジル

Tabela de Brasileira de Composição de Alimentos

ブラジルの食品成分表は1205食品の主要な成分を提供します.一括ダウンロードはできないようです.

ラテンアメリカ

Red Latinoamericana de Composición de Alimentos

17の食品群,443の食品の24成分について提供します.ダウンロードは来ませんが全データはブラウザで見られます.中南米各国へのリンクもあります.アルゼンチン,ボリビア,ブラジル,チリ,コロンビアコスタリカメキシコペルー,ウルグアイそれぞれへのリンクがあります.

オーストラリア

NUTTAB 2010

オーストラリアの食品成分表は使い勝手が良く,ブラウザから全データを閲覧出来ます.19食品群,2190食品の196成分について提供します.ただデータの一括ダウンロードは出来ず,登録制になっているようです.

ニュージーランド

ニュージーランドの食品成分表は2700の食品の主要な7成分についてNew Zealand Food Composition Data for Nutrition Information Panel (NZFCD-NIP)が提供しています.ダウンロードできるのはWindows版のアプリケーションです.登録制のようです.

太平洋諸島

The Pacific Islands food composition tables

太平洋諸島の食品成分表は20食品群,882食品の22成分について提供します.ページ上でも閲覧可能で,PDFファイルをダウンロード可能です.

中国

China Food Nutrition Network

22食品群,14成分について提供します.リンクは英文ページですが,実際のデータは主に中国語で書かれています.

マレーシア

Malaysian Foods Composition Database; //www.nutriweb.org.my/searchfood.php

マレーシアのサイトは残念ながらリンク切れです.

シンガポール

シンガポール健康増進委員会のサイトは先進的です.What’s Eating Singaporeというページの右下にHealth Toolsというリンクがあります.Energy and Nutrient Composition of Foodは食品あたりの成分,Recipe Analysisはレシピごとの成分,Food Intake Assessmentでは年齢と性別から一週間の推奨摂取量を計算してくれます.驚くべきことに,BuUukではスマホのアプリまでリリースしています.

日本

文部科学省の資源調査分科会が公表している食品成分表です.18の食品群,1878食品の50成分についてpdfで提供されてるんですが,いかんせん使いにくい.面倒くさい方は,手前味噌ですがこちらからどうぞ.

タイ

BUREAU OF NUTRITION

タイではヨード欠乏に注意を払っていることが伺えます.13食品群,18成分について提供する一般的な食品成分表の他に,脂肪酸とコレステロール,アミノ酸含有量の成分表もあります.

ベトナム

VIETNAMESE FOOD COMPOSITION TABLE

ベトナムの食品成分表は14食品群,526食品の86成分について提供します.

参照:
Food composition databases
国立国会図書館
DTU Food
International food composition table/database directory

Execute Fisher’s exact test with T-SQL

Fisher’s probability is function depend on cut-off value. In this article, you could draw scatter plot ROC curve and get Fisher’s probability with query below. In ROC curve, you would plot false positive rate on horizontal axis and sensitivity on vertical axis. You could plot cut-off value on horizontal axis and Fisher’s probability on vertical axis. You could get best cut-off value with minimum probability in line graph if minimum probability would be smaller than 0.05.

CREATE TABLE [dbo].[T_DATA]
    (    ID       nchar(8)         NOT NULL, PRIMARY KEY
    ,    Test     decimal(4, 2)    NOT NULL
    ,    Outcome  nchar(1)         NOT NULL
    );
GO
ALTER TABLE T_DATA ADD CONSTRAINT CK_Outcome CHECK (Outcome = '0' OR Outcome = '1');
GO

Run the code below to create function, converting from factorial to sum of logarithm.

CREATE FUNCTION [dbo].[LOG_FACT](
    @SrcNumber FLOAT
)
RETURNS FLOAT
BEGIN
    DECLARE @DesNumber   FLOAT
    SET @DesNumber = LOG(1)
    WHILE @SrcNumber > 0
    BEGIN
        SET @DesNumber = @DesNumber + LOG(@SrcNumber)
        SET @SrcNumber = @SrcNumber - 1
    END
    RETURN @DesNumber
END
GO

Run the code below to create stored procedure that creates cross table from T_DATA.

CREATE PROCEDURE [dbo].[sp_Cut_by_Test]
    @CutOff  decimal(4, 2)
AS
BEGIN
WITH Cross_Table AS
(
  SELECT COUNT(*) AS 'N'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff AND T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'a'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff AND T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'b'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff AND T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'c'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff AND T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'd'
    ,    SUM(CASE WHEN                            T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'a+c'
    ,    SUM(CASE WHEN                            T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'b+d'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff                          THEN 1 ELSE 0 END) AS 'a+b'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff                          THEN 1 ELSE 0 END) AS 'c+d'
    FROM T_DATA
)
  SELECT @CutOff
    ,    Cross_Table.[N]
    ,    Cross_Table.[a]
    ,    Cross_Table.[b]
    ,    Cross_Table.
    ,    Cross_Table.[d]
    ,    Cross_Table.[a+c]
    ,    Cross_Table.[b+d]
    ,    Cross_Table.[a+b]
    ,    Cross_Table.
    ,    Cross_Table.[a]/Cross_Table.[a+c] AS 'Sensitivity'
    ,    Cross_Table.[d]/Cross_Table.[b+d] AS 'Specificity'
    ,    1 - Cross_Table.[d]/Cross_Table.[b+d] AS 'FalsePositive'
    FROM Cross_Table;
END
GO

Run the code below to create stored procedure that calculates Fisher’s probability. @Start means minimum value of test, @End means maximum value of test and @Step means step value of test from @Start to @End. For example, @Start 2.0, @End 4.0 and @Step 0.1, respectively.

CREATE PROCEDURE [dbo].[FisherExactTest]
    (    @Start  decimal(4, 2)
    ,    @End    decimal(4, 2)
    ,    @Step   decimal(4, 2)
    )
AS
BEGIN
    CREATE TABLE #Result
    (    [CutOff]    decimal(4, 2)    NOT NULL
    ,    N    int    NOT NULL
    ,    a    int    NOT NULL
    ,    b    int    NOT NULL
    ,    c    int    NOT NULL
    ,    d    int    NOT NULL
    ,    [a+c]    int    NOT NULL
    ,    [b+d]    int    NOT NULL
    ,    [a+b]    int    NOT NULL
    ,        int    NOT NULL
    ,    Sensitivity    FLOAT    NOT NULL
    ,    Specificity    FLOAT    NOT NULL
    ,    FalsePositive    FLOAT    NOT NULL
    )
    DECLARE @CutOff  decimal(4, 2)
    SET @CutOff = @Start
    WHILE @CutOff <= @End
    BEGIN
       INSERT INTO #Result EXEC sp_Cut_by_Test @CutOff
       SET @CutOff = @CutOff + @Step
    END
  SELECT CutOff
    ,    N
    ,    a
    ,    b
    ,    c
    ,    d
    ,    [a+c]
    ,    [b+d]
    ,    [a+b]
    ,    [c+d]
    ,    Sensitivity
    ,    Specificity
    ,    FalsePositive
    ,    EXP(dbo.LOG_FACT([a+b])
         +   dbo.LOG_FACT([c+d])
         +   dbo.LOG_FACT([a+c])
         +   dbo.LOG_FACT([b+d])
         -   dbo.LOG_FACT(N)
         -   dbo.LOG_FACT(CASE WHEN a = 0 THEN 1 ELSE a END)
         -   dbo.LOG_FACT(CASE WHEN b = 0 THEN 1 ELSE b END)
         -   dbo.LOG_FACT(CASE WHEN c = 0 THEN 1 ELSE c END)
         -   dbo.LOG_FACT(CASE WHEN d = 0 THEN 1 ELSE d END)) AS [FisherExact_Test]
    FROM #Result
   ORDER BY CutOff
END

References;
How to calculate Fisher’s exact test with logarithm?
How to calculate four numbers from marginal total in cross tabulation?
Stored procedure to calculate factorial with natural logarithm

T-SQLでFisherの直接確率検定を行う

 Fisher の確率はカットオフ値の関数であると以前書きました.今回は下記のクエリで ROC 曲線を描き,Fisherの直接確率検定を行います.ROC 曲線では横軸に偽陽性率を取り,縦軸に感度を取ります.カットオフ値を横軸に取り,Fisher の確率を縦軸にグラフを描くと,グラフの最小値に該当するカットオフ値が求めるものとなります.ただし,p < 0.05 であることが条件です.

CREATE TABLE [dbo].[T_DATA]
    (    ID       nchar(8)         NOT NULL, PRIMARY KEY
    ,    Test     decimal(4, 2)    NOT NULL
    ,    Outcome  nchar(1)         NOT NULL
    );
GO
ALTER TABLE T_DATA ADD CONSTRAINT CK_Outcome CHECK (Outcome = '0' OR Outcome = '1');
GO

 下記の関数は階乗を対数の和に変換します.

CREATE FUNCTION [dbo].[LOG_FACT](
    @SrcNumber FLOAT
)
RETURNS FLOAT
BEGIN
    DECLARE @DesNumber   FLOAT
    SET @DesNumber = LOG(1)
    WHILE @SrcNumber > 0
    BEGIN
        SET @DesNumber = @DesNumber + LOG(@SrcNumber)
        SET @SrcNumber = @SrcNumber - 1
    END
    RETURN @DesNumber
END
GO

 下記のストアドプロシージャはカットオフ値を変数化して T_DATA からクロス表を作成します.

CREATE PROCEDURE [dbo].[sp_Cut_by_Test]
    @CutOff  decimal(4, 2)
AS
BEGIN
WITH Cross_Table AS
(
  SELECT COUNT(*) AS 'N'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff AND T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'a'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff AND T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'b'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff AND T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'c'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff AND T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'd'
    ,    SUM(CASE WHEN                            T_DATA.Outcome = '1' THEN 1 ELSE 0 END) AS 'a+c'
    ,    SUM(CASE WHEN                            T_DATA.Outcome = '0' THEN 1 ELSE 0 END) AS 'b+d'
    ,    SUM(CASE WHEN T_DATA.Test <= @CutOff                          THEN 1 ELSE 0 END) AS 'a+b'
    ,    SUM(CASE WHEN T_DATA.Test >  @CutOff                          THEN 1 ELSE 0 END) AS 'c+d'
    FROM T_DATA
)
  SELECT @CutOff
    ,    Cross_Table.[N]
    ,    Cross_Table.[a]
    ,    Cross_Table.[b]
    ,    Cross_Table.
    ,    Cross_Table.[d]
    ,    Cross_Table.[a+c]
    ,    Cross_Table.[b+d]
    ,    Cross_Table.[a+b]
    ,    Cross_Table.
    ,    Cross_Table.[a]/Cross_Table.[a+c] AS 'Sensitivity'
    ,    Cross_Table.[d]/Cross_Table.[b+d] AS 'Specificity'
    ,    1 - Cross_Table.[d]/Cross_Table.[b+d] AS 'FalsePositive'
    FROM Cross_Table;
END
GO

 下記のストアドプロシージャはクロス表から Fisher の確率を求めます.@Start とは test の最小値であり, @End は test の最大値, @Step は @Start から @End までの増分のことです.例えばそれぞれ @Start を 2.0 とし,@End を 4.0 とし,@Step を 0.1 とするなどです.

CREATE PROCEDURE [dbo].[FisherExactTest]
    (    @Start  decimal(4, 2)
    ,    @End    decimal(4, 2)
    ,    @Step   decimal(4, 2)
    )
AS
BEGIN
    CREATE TABLE #Result
    (    [CutOff]    decimal(4, 2)    NOT NULL
    ,    N    int    NOT NULL
    ,    a    int    NOT NULL
    ,    b    int    NOT NULL
    ,    c    int    NOT NULL
    ,    d    int    NOT NULL
    ,    [a+c]    int    NOT NULL
    ,    [b+d]    int    NOT NULL
    ,    [a+b]    int    NOT NULL
    ,        int    NOT NULL
    ,    Sensitivity    FLOAT    NOT NULL
    ,    Specificity    FLOAT    NOT NULL
    ,    FalsePositive    FLOAT    NOT NULL
    )
    DECLARE @CutOff  decimal(4, 2)
    SET @CutOff = @Start
    WHILE @CutOff <= @End
    BEGIN
       INSERT INTO #Result EXEC sp_Cut_by_Test @CutOff
       SET @CutOff = @CutOff + @Step
    END
  SELECT CutOff
    ,    N
    ,    a
    ,    b
    ,    c
    ,    d
    ,    [a+c]
    ,    [b+d]
    ,    [a+b]
    ,    [c+d]
    ,    Sensitivity
    ,    Specificity
    ,    FalsePositive
    ,    EXP(dbo.LOG_FACT([a+b])
         +   dbo.LOG_FACT([c+d])
         +   dbo.LOG_FACT([a+c])
         +   dbo.LOG_FACT([b+d])
         -   dbo.LOG_FACT(N)
         -   dbo.LOG_FACT(CASE WHEN a = 0 THEN 1 ELSE a END)
         -   dbo.LOG_FACT(CASE WHEN b = 0 THEN 1 ELSE b END)
         -   dbo.LOG_FACT(CASE WHEN c = 0 THEN 1 ELSE c END)
         -   dbo.LOG_FACT(CASE WHEN d = 0 THEN 1 ELSE d END)) AS [FisherExact_Test]
    FROM #Result
   ORDER BY CutOff
END

参照記事
対数を用いてFisherの直接確率検定を計算するには
周辺度数からクロス表を作成するには
対数により階乗を計算するストアドプロシージャを作成する

Stored procedure to calculate factorial with natural logarithm

This site has shown stored procedure and function to calculate factorial with SQL. Although the logic is so simple as extracting one from previous argument and multiplying to it, it requires high cost of computing power. Therefore, the maximum of argument is restricted to so relatively small integer. In this article, you can calculate factorial with converting argument to natural logarithm, adding them and re-converting it to power of e, the base of natural logarithm.

CREATE PROCEDURE [dbo].[LOG_FACT]
    @SrcNumber    FLOAT
AS
BEGIN
    DECLARE	@DesNumber    FLOAT
    SET @DesNumber = LOG(1)
    WHILE @SrcNumber > 0
    BEGIN
        SET @DesNumber = @DesNumber + LOG(@SrcNumber)
        SET @SrcNumber = @SrcNumber - 1
    END
    SELECT	EXP(@DesNumber)
END

Maximum of argument is 170.

EXEC LOG_FACT 170;
7.25741561530971E+306

対数により階乗を計算するストアドプロシージャを作成する

 SQL で階乗を計算するストアドプロシージャにはSQL-Serverの関数・プロシージャのVB.NETでの実行などのサイトがありますが,入力できる引数の上限が比較的小さくあまり実用的ではありません.引数から1ずつ減算して前の値に掛けていくという計算のロジックは比較的シンプルですが,計算コストは逆に高くなります.ここでは引数を一旦自然対数に変換して対数の和を求め,最後に自然対数の底のべき乗を求めることで階乗を求めます.

CREATE PROCEDURE [dbo].[LOG_FACT]
    @SrcNumber    FLOAT
AS
BEGIN
    DECLARE	@DesNumber    FLOAT
    SET @DesNumber = LOG(1)
    WHILE @SrcNumber > 0
    BEGIN
        SET @DesNumber = @DesNumber + LOG(@SrcNumber)
        SET @SrcNumber = @SrcNumber - 1
    END
    SELECT	EXP(@DesNumber)
END

 引数に取りうる最大値は170です.

EXEC LOG_FACT 170;
(列名なし)
7.25741561530971E+306

CSV file of the ‘Standard Tables of Food Composition in Japan 2010’

I had posted the article which contains ‘M_FOODS.txt’, which is derived from the ‘Standard Tables of Food Composition in Japan 2010’, on January 12, 2012. The employee of the Ministry of Education, Culture, Sports, Science & Technology in Japan (MEXT) has asked me to inform on my blog of name and unit of each component of ‘M_FOODS.txt’ file. I have added name and unit to table head of CSV file. Then I post it on my blog.

In original PDF files, comma character is used in component as character rather than as delimiter and space character is used as delimiter. Because I could not use comma character as delimiter, I had to use tab character as delimiter. Although we use double quotes as quote with EXCEL, such other program as relational database management software may use single quotes as quote. Therefore, I didn’t use quote at all. When you open this file, don’t double click to open, please. Please use ‘Text file wizard’. In the last tab of wizard, you would had to select ‘string’ data type of first column. If you would not have followed this warning, you could not open correctly and you would be confused why the length of item number is 4 and the first ‘0’ is missing.

This file has 54 columns and 1,881 rows. The first three lines show data structure, following lines from the fourth line show data itself. Japanese name of components in the first line, English name of components in the second line and unit in the third line. It means ‘g’ as gram, ‘mg’ as milligram and ‘microgram’ as micro-gram.

Please note following:

1. I have replaced the strings ‘(0)’, ‘Tr’, ‘(Tr)’ and ‘-‘ with ‘0’.

2. The text file is derived from ‘Standard Tables of Food Composition in Japan 2010’, published by Report of the Subdivision on Resources The Council for Science and Technology, MEXT, JAPAN. Please contact MEXT to obtain application or notification before duplication or reproduction.

E-mail: kagseis@mext.go.jp

M_FOODS.csv

References:
Classify the Item_Number of the ‘Standard Tables of Food Composition in Japan 2010′, Part 1
Classify the Item_Number of the ‘Standard Tables of Food Composition in Japan 2010′, Part 2

日本食品標準成分表2010のcsvファイル

2012年1月12日,日本食品標準成分表2010のテキストデータの記事を投稿しました.その際に’M_FOODS.txt’ファイルに各項目の名称と単位を付記されたいとの依頼があったと追記しました.今回は表頭に各項目名と単位を付記したcsvファイルを作成しましたので公開いたします.

元のPDFファイルでは各要素内にコンマを使用しており,デリミタとしてスペースを使用していました.本ファイルではタブをデリミタとして使用しています.EXCELでは通常ダブルクォーテーションを引用符として用いますが,他のデータベースソフトではシングルクォーテーションを引用符として用いるものもあります.そのため本ファイルでは引用符を使用しておりません.EXCELに取り込む際にはダブルクリックで開かず,必ず’データ’タブの’外部データをインポートする’から’テキストファイル’を選択してください.またテキストファイルウィザードの最後のタブで1列目のデータ型を’文字列’にしてください.以上の注意点を守らない場合,食品番号は通常5桁の数値ですが,先頭の’0’が欠落する場合があります.



本ファイルは54列1881行から成ります.表頭3行はデータ構造を示し,4行目以降が実際のデータです.1行目は日本語の項目名,2行目は英語の項目名,3行目は単位です.gはグラム,mgはミリグラム,microgramはマイクログラムです.

以下の点にご注意ください.

1.「日本食品標準成分表2010」に記載されている,(0),Tr,(Tr),-,について,当データでは「 0 」と表記しています.

2.本表の食品成分値は文部科学省科学技術・学術審議会資源調査分科会報告「日本食品標準成分表2010」によるものです.食品成分値を複製又は転載する場合は事前に文部科学省への許可申請もしくは届け出が必要となる場合があります.

連絡先:文部科学省科学技術・学術政策局政策課資源室 E-mail: kagseis@mext.go.jp

M_FOODS.csv

参照:
日本食品標準成分表2010の食品番号をカテゴリー分類する その1
日本食品標準成分表2010の食品番号をカテゴリー分類する その2

The text file, ‘Standard Tables of Food Composition in Japan 2010’

I requested Office for Resources Policy Division Science and Technology Policy
Bureau, Ministry of Education, Culture, Sports, Science and Technology (MEXT) to approve that I publish the text file, ‘Standard Tables of Food Composition in Japan 2010’ at the end of 2011. On January 13, 2012, I have received the e-mail from staff that the settlement has been completed. Therefore, I have published the text file, ‘Standard Tables of Food Composition in Japan 2010’. Please note the following:

1. I have replaced the strings ‘(0)’, ‘Tr’, ‘(Tr)’ and ‘-‘ with ‘0’.

2. The text file is derived from ‘Standard Tables of Food Composition in Japan 2010’, published by Report of the Subdivision on Resources The Council for Science and Technology, MEXT, JAPAN. Please contact MEXT to obtain application or notification before duplication or reproduction.

E-mail: kagseis@mext.go.jp

M_FOODS

Reference:
CSV file of the ‘Standard Tables of Food Composition in Japan 2010′

日本食品標準成分表2010のテキストデータ

文部科学省科学技術・学術政策局政策課資源室に表題のファイルの公開を申請しておりましたが,1月13日決裁が終了したとの連絡がありましたので,公開いたします.なお,公開したファイルを利用するにあたっては下記の2点についてご注意下さい.

1.「日本食品標準成分表2010」に記載されている,(0),Tr,(Tr),-,について,当データでは「 0 」と表記しています.

2.本表の食品成分値は文部科学省科学技術・学術審議会資源調査分科会報告「日本食品標準成分表2010」によるものです.食品成分値を複製又は転載する場合は事前に文部科学省への許可申請もしくは届け出が必要となる場合があります.

連絡先:文部科学省科学技術・学術政策局政策課資源室 E-mail: kagseis@mext.go.jp

M_FOODS.csv

決裁にあたり,各項目の名称と単位とを付記されたいとの依頼が電話でありました.後日修正してアップロードします.

参照:
日本食品標準成分表2010のcsvファイル