2016-12-11 9 views
1

Я пытаюсь получить номер элемента на основе логического поля. Логическое поле - это динамическое поле, переданное как параметр (как показано в этом post) во время выполнения.Использование имени столбца в качестве параметра и использование входного параметра в предложении WHERE/HAVING

EDIT: Наконец-то решил. Просто изменили линии WHEN на: WHEN 'SI_A' THEN COUNT(CASE WHEN SI_A=1 THEN 1 END). Спасибо @FDavidov!

SELECT 
     OrganismName 
     , MONTH(DateDiscovered) AS 'Month' 
     , CASE @Column 
      WHEN 'SI_A' THEN COUNT(CASE WHEN SI_A=1 THEN 1 END) 
      WHEN 'SI_B' THEN COUNT(CASE WHEN SI_B=1 THEN 1 END) 
      WHEN 'SI_C' THEN COUNT(CASE WHEN SI_C=1 THEN 1 END) 
      WHEN 'SI_D' THEN COUNT(CASE WHEN SI_D=1 THEN 1 END) 
     END AS 'Cases' 
    FROM tblFindings 
    INNER JOIN 
     tblOrganism 
    ON 
     tblFindings.OrganismID = tblOrganism.OrganismID 
    WHERE 
     (SELECT 
      CASE @Column 
      WHEN 'SI_A' THEN COUNT(CASE WHEN SI_A=1 THEN 1 END) 
      WHEN 'SI_B' THEN COUNT(CASE WHEN SI_B=1 THEN 1 END) 
      WHEN 'SI_C' THEN COUNT(CASE WHEN SI_C=1 THEN 1 END) 
      WHEN 'SI_D' THEN COUNT(CASE WHEN SI_D=1 THEN 1 END) 
     END AS 'Cases' 
     FROM tblFindings 
     INNER JOIN 
      tblOrganism 
     ON 
      tblFindings.OrganismID = tblOrganism.OrganismID 
     ) > 0 
    GROUP BY 
     OrganismName 
     , MONTH(DateDiscovered) 
    ORDER BY 
     OrganismName 
     , MONTH(DateDiscovered) 

EDIT: Забыл включить полный стол. Я пытался использовать UNPIVOT, но я получаю сообщение об ошибке: «OrganismID был указан несколько раз в u». Это один не передать имя столбца в качестве параметра однако:

SELECT 
    OrganismName 
    , MONTH(DateDiscovered) AS 'Month' 
    , u.Cases 
    , u.Sites 
FROM tblFindings 
INNER JOIN tblOrganism ON tblFindings.OrganismID = tblOrganism.OrganismID 
UNPIVOT (
    Cases FOR Sites in (SI_A, SI_B, SI_C, SI_D) 
    ) u 
WHERE u.Cases > 0 

Table structure/sample data

Используя этот code, я также получаю строки, имеющие в общей сложности 0. Это результат, который я м пытается достичь:

========================= 
|OrganismName|Month|SI_A| 
========================= 
|nota  |2 |2 | 
|something |10 |1 | 
|woo   |2 |1 | 
========================= 

========================= 
|OrganismName|Month|SI_B| 
========================= 
|something |4 |1 | 
|something |10 |1 | 
========================= 

========================= 
|OrganismName|Month|SI_C| 
========================= 
|something |10 |2 | 
========================= 

========================= 
|OrganismName|Month|SI_D| 
========================= 
|something |10 |1 | 
========================= 

Вместо этого, я получаю это (если я кормлю "SI_A" в качестве параметра):

========================== 
|OrganismName|Month|Cases| 
========================== 
|nota  |2 |2 | 
|something |4 |0 | 
|something |10 |1 | 
|woo   |2 |1 | 
|woo   |7 |0 | 
========================== 

Я использовал предложение WHERE, но получил результат выше. Затем я попробовал предложение HAVING, но получил те же результаты. Я не слишком хорошо разбираюсь в SQL, кроме простых запросов, но как бы добиться этого?

+0

'select ... from (<весь ваш текущий оператор select с группой by>), где case> 0' - поместить это resuls (с 0s) в подзапрос или CTE и применить дополнительные фильтры на следующем уровне. –

ответ

0

Я не уверен, что отражается в ваших представленных результатов, но здесь намек на очевидную ошибку (и отсюда вы можете быть в состоянии решить вашу проблему):

SELECT 
    OrganismName 
    MONTH(DateDiscovered) AS 'Month' 
, CASE @Column 
     WHEN 'SI_A' THEN SUM(CASE WHEN SI_A=1 THEN 1 ELSE 0 END) 
     WHEN 'SI_B' THEN SUM(CASE WHEN SI_B=1 THEN 1 ELSE 0 END) 
     WHEN 'SI_C' THEN SUM(CASE WHEN SI_C=1 THEN 1 ELSE 0 END) 
     WHEN 'SI_D' THEN SUM(CASE WHEN SI_D=1 THEN 1 ELSE 0 END) 
     ELSE NULL 
END AS 'Cases' 
FROM tblFindings 
.... 

Вы проверяете если (например) SI_A является 1, чтобы добавить 1 иначе 0. Теперь, что произойдет, если SI_A = 2? Вы также добавляете 0.

Поскольку я не совсем понимаю, если вы, что t0 SUM все значения или COUNT сколько случаев у вас есть значение> 0, я отправляю здесь оба случая:

Для SUM:

... WHEN 'SI_A' THEN SUM(CASE WHEN SI_A > 0 THEN SI_A ELSE 0 END) ... 

или

... WHEN 'SI_A' THEN SUM(SI_A) ... 

(второй эквивалент в предположении, что вы получите только ting 0 или номер>0).

графы:

... WHEN 'SI_A' THEN SUM(CASE WHEN SI_A > 0 THEN 1 ELSE 0 END) ... 

Hope этого решения вы Были looing For.

UPDATE

Вот один и простой выбор вы можете начать с:

SELECT 
    OrganismName 
    MONTH(DateDiscovered) AS 'Month' 
, CASE @Column 
     WHEN 'SI_A' THEN SUM(CASE WHEN SI_A > 0 THEN 1 ELSE 0 END) 
     WHEN 'SI_B' THEN SUM(CASE WHEN SI_B > 0 THEN 1 ELSE 0 END) 
     WHEN 'SI_C' THEN SUM(CASE WHEN SI_C > 0 THEN 1 ELSE 0 END) 
     WHEN 'SI_D' THEN SUM(CASE WHEN SI_D > 0 THEN 1 ELSE 0 END) 
     ELSE NULL 
END AS @Column 
FROM tblFindings 

Я думаю, это будет делать.

+0

Ой, я должен был указывать пункты, когда они ИСТИННЫЕ. Я пробовал этот код и избавился от 0. Я с тех пор редактировал мой код и пытался использовать UNPIVOT, но обнаружил ошибку. Вы случайно не знаете, почему я получаю столбец несколько раз в разделе UNPIVOT? –

+0

PIVOT? Зачем вам это нужно? Я уточню свой ответ. Оставайтесь с нами ... – FDavidov

+0

Я полагаю, что это альтернативный подход. Я проверяю, правильно ли я получил правильные значения (избавился от 0s), используя условие: 'WHEN 'SI_A' \t THEN COUNT (CASE WHEN SI_A = 1 THEN 1 ELSE 0 END)' –

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