SQL-запрос для расчета значения из двух таблиц - PullRequest
1 голос
/ 29 октября 2010

Привет У меня есть две таблицы, которые связаны следующим образом:

Table1
gene goterms
ape   1a
ape   1b
ape   1c
boy   2a
boy   1a
cat   1a
cat   1c

Table2
gene gene count
ape  ape   3
ape  boy   1
ape  cat   2
boy  ape   1
boy  boy   2
boy  cat   1  
cat  ape   2
cat  boy   1
cat  cat   2

Теперь мне нужно значение, которое соответствует второй строке таблицы2 как = (количество) / (количество обезьян из таблицы 1 + количество мальчиков из таблицы 1) - количество

для строки [ape boy 1], значение = 1 / ((3 + 2) - 1) = 0,25

аналогично для всех остальных строк в таблице 2.

Вывод должен быть как

Таблица3 рассчитать количество генов обезьяна обезьяна 3 1 мальчик обезьяны 1 .25 обезьяна кошка 2 .5 мальчик обезьяна 1 .25 мальчик мальчик 2 1 мальчик кот 1 .2 кошачья обезьяна 2 .5 кот мальчик 1 .2 кошка кошка 2 1

Мне нужен SQL-запрос для этого, я пытался разными способами, но тщетно.

Спасибо ...

Ответы [ 4 ]

2 голосов
/ 29 октября 2010

ВЫБРАТЬ ген, ген2, считать, считать / ((ВЫБРАТЬ счет () ОТ Table1 t1 ГДЕ t2.gene = t1.gene) + (ВЫБЕРИТЕ количество () ИЗ Table1 t1 WHERE t2.gene2 = t1.gene) - считать) как значение из таблицы 2 t2

выходы:

gene    gene2   count   value
ape     ape     3       1.0000
ape     boy     1       0.2500
ape     cat     2       0.6667
boy     ape     1       0.2500
boy     boy     2       1.0000
boy     cat     1       0.3333
cat     ape     2       0.6667
cat     boy     1       0.3333
cat     cat     2       1.0000
1 голос
/ 29 октября 2010

У вас есть повторяющиеся имена столбцов в таблице 2.Предполагая, что первый столбец таблицы 2 является «геном», а второй столбец - «геном 2»:

Select *
    , [Count]
        / ( Coalesce(Gene1.Total,0) + Coalesce(Gene2.Total,0) - Coalesce(Table2.Count,0))
From Table2
    Left Join (
                Select T1.gene, Count(*) As Total
                From Table1 As T1
                Group By T1.gene
                ) As Gene1
            On Gene1.gene = Table2.gene
    Left Join (
                Select T2.gene, Count(*) As Total
                From Table1 As T2
                Group By T2.gene
                ) As Gene2
            On Gene2.gene = Table2.gene2
Where ( Coalesce(Gene1.Total,0) + Coalesce(Gene2.Total,0) - Coalesce(Table2.Count,0)) > 0

Конечно, если у вас много данных, это не будет самый быстрый запрос вмир.

С SQL Server 2008 вы можете написать его немного чище, используя выражение для общей таблицы, например:

With CountByGene As
    (
    Select T1.gene, Count(*) As Total
    From Table1 As T1
    Group By T1.gene
    )
Select *
    , [Count]
        / ( Coalesce(Gene1.Total,0) + Coalesce(Gene2.Total,0) - Coalesce(Table2.Count,0))
From Table2
    Left Join CountByGene As Gene1
        On Gene1.gene = Table2.gene
    Left Join CountByGene As Gene2
        On Gene2.gene = Table2.gene2
Where ( Coalesce(Gene1.Total,0) + Coalesce(Gene2.Total,0) - Coalesce(Table2.Count,0)) > 0
0 голосов
/ 04 ноября 2010

ВЫБРАТЬ ген, ген2, количество, количество / ((количество SELECT () ИЗ таблицы 1 t1 ГДЕ t2.gene = t1.gene) + (количество SELECT () ИЗ таблицы 1 t1 ГДЕ t2.gene2 =t1.gene) - подсчитать) как рассчитать из таблицы 2 t2

0 голосов
/ 29 октября 2010

SELECT gene, count(*) AS value FROM Table1 GROUP BY gene; даст вам счет на ген в таблице 1.

SELECT value FROM ( SELECT gene, count(*) as value FROM Table1 GROUP BY gene; ) WHERE gene = 'boy'; даст вам значение из оператора выбора ниже.

Звучит как домашняя работа, поэтому я просто дам подсказку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...