2015-12-24 4 views
1

У меня есть сценарий, в котором есть две таблицы, одна из которых - MAIN, а вторая - Child. Есть возможен 4 типа статуса 1 = Не начато 2 = Started 3 = Запуск 4 = ОстановленоВыбор записей На основе группы в sql-сервере

У меня есть случайные записям в ребенке для ряда друг основных таблиц, мне нужно узнать только подсчитывать записи в в которой используется таблица «Только для детей» (1,4).

ниже У меня есть сценарий.

CREATE TABLE #Main 
    (
    ID INT , 
    CreateDateTime DATETIME , 
    LLevel INT 
) 
CREATE TABLE #Child 
    (
    ID INT , 
    MainID INT , 
    STATUS INT 
    ) 
    -- Status(1= NotStarted, 2= Started ,3 = Ruunning ,4 = Stopped) 

    INSERT INTO #Main 
    SELECT 1 , 
      '2015-12-24 18:48:41' , 
      1 
    UNION ALL 
    SELECT 2 , 
      '2015-12-24 18:49:59' , 
      3 
    UNION ALL 
    SELECT 3 , 
      '2015-12-24 18:51:01' , 
      1 
    UNION ALL 
    SELECT 4 , 
      '2015-12-24 18:53:11' , 
      4 
    UNION ALL 
    SELECT 5 , 
      '2015-12-24 18:57:11' , 
      2 



    INSERT INTO #Child 
    SELECT 1 , 
      1 , 
      1 -- MIAN ID = 1 
    UNION ALL 
    SELECT 2 , 
      1 , 
      2 
    UNION ALL 
    SELECT 3 , 
      1 , 
      3 
    UNION ALL 
    SELECT 4 , 
      2 , 
      1 -- MIAN ID = 2 
    UNION ALL 
    SELECT 5 , 
      2 , 
      4 
    UNION ALL 
    SELECT 6 , 
      3 , 
      1 -- MIAN ID = 3 
    UNION ALL 
    SELECT 7 , 
      3 , 
      2 
    UNION ALL 
    SELECT 8 , 
      3 , 
      3 
    UNION ALL 
    SELECT 9 , 
      4 , 
      1 -- MIAN ID = 4 
    UNION ALL 
    SELECT 10 , 
      4 , 
      2 
    UNION ALL 
    SELECT 11 , 
      4 , 
      3 
    UNION ALL 
    SELECT 12 , 
      5 , 
      1 -- MIAN ID = 2 
    UNION ALL 
    SELECT 13 , 
      5 , 
      4 

SELECT * 
FROM #Main 
SELECT * 
FROM #Child 
ORDER BY MainID ASC 

DROP TABLE #Main 
DROP TABLE #Child 

У меня есть изображение, эти записи, которые мне нужны, означают, что счет должен быть двоим. enter image description here

+0

Таблицы, начинающиеся с '#', являются временными таблицами. Вам не нужно их бросать. – Hogan

ответ

0

Это не самый быстрый способ сделать это, но оптимизатор приблизит его. Кроме того, ясно видно, что это правильно, и понять, как это работает, используя КТР

WITH haveone as 
(
    SELECT DISTINCT MainID as ID 
    FROM #Child 
    WHERE STATUS = 1 
), havefour as 
(
    SELECT DISTINCT MainID as ID 
    FROM #Child 
    WHERE STATUS = 4 
), haveboth as 
(
    SELECT haveone.ID 
    FROM haveone 
    JOIN havefour ON haveone.ID = havefour.ID 
), haveother as 
(
    SELECT DISTINCT MainID as ID 
    FROM #Child 
    WHERE STATUS NOT IN (1,4) 
) 
SELECT ID 
FROM haveboth 
WHERE ID NOT IN (SELECT ID FROM haveother) 
+0

с запросом не workin gin sql 2008 – DareDevil

+0

@DareDevil - вы говорите об амбиге по субботу hasboth? Шутки в сторону? В любом случае здесь есть рабочая скрипка http://sqlfiddle.com/#!3/da2288/4 – Hogan

0

У меня есть фигура и производятся результат таким образом.

SELECT count(m.id) FROM #main m INNER JOIN #child c on m.id = c.mainid and c.status in (1,4) 
and c.mainid not in (select mainid from #child where status in (2,3)) group by m.id 
having count(m.id) = 2 
+0

вам не нужно различать, если вы делаете группу. Вы должны использовать счетчик (отличная m.id) и никакая группа – Hogan

+0

Этот запрос не будет выполнен, если вы добавите новый статус (5) – Hogan

+0

@Hogan У меня есть фиксированное количество статусов, как указано выше, при создании структуры таблицы. in Answer Query использовал 'Have' Clause – DareDevil

Смежные вопросы