Хорошо, должен признать, этот вопрос меня заинтриговал!Я отвечаю, потому что я ненавижу идею SQL-запроса, длина текста которого основана на квадрат числа столбцов.Потому что, честно говоря, у вас будет 72 случая, если у вас есть 12 столбцов (12 * 12/2).Такой код ужасно поддерживать и ужасно модифицировать.
Итак, я подойду к этому как математическая головоломка.Допустим, есть только два столбца: a и b.Если a = 0, ответ 0;если a = 1, ответ равен 1, если b = 0, и 2, если b = 1.Ну, это довольно просто: ответ: a * (a + b).Если a = 0, вы умножаете некоторое число на 0, что будет равно нулю.
Или мы можем даже быть более любопытными - мы можем сказать, что это a * (1 + b) - в любом случае работает, и этоКстати, у нас на изображении только один «а».
Answer(a,b) = a*(1+b)
Хорошо, а как насчет третьего столбца?
Теперь у нас есть a, b и c.Если a = 0, наш ответ по-прежнему равен нулю.Но если a = 1, наш ответ должен быть 1 + ответ (b, c).
Answer(a,b,c) = a*(1+Answer(b,c))
Answer(a,b,c) = a*(1+b*(1+c)
Имеет ли это смысл?И теперь, когда мы знаем это, закономерность довольно очевидна:
Answer(a,b,c,d,....) = a*(1+b*(1+c*(1+d* ...
Хорошо - так как мы смотрим с точки зрения длины?Каждый термин - каждый столбец - используется только один раз .Если у вас есть 12 столбцов, у вас будет только 12 терминов!Не 72!(Плюс, это довольно легко расширить, включив в него еще несколько столбцов.)
Еще лучше, действительно просто получить суммы каждого «столбца» в этой точке.В конце концов, ваши данные будут выглядеть так:
ColA,ColB,ColC,ColD,KevinsAnswer
0 1 0 0 0
1 1 0 1 2
1 1 1 1 4
0 0 1 0 0
1 0 0 0 1
1 1 1 0 3
Если вы хотите узнать, сколько строк имеют по крайней мере два 1?Получите сумму () где KevinsAnswer> = 2.
Так что мой окончательный ответ будет примерно таким (я извиняюсь, если здесь есть какие-то не-оракульные команды; мой опыт - MS SQL)
select StraightMonths,Count(*) from
(
select B.PREVIOUS_1 *
(1 + B.PREVIOUS_2 *
(1 + B.PREVIOUS_3 *
(1 + B.PREVIOUS_4 *
(1 + B.PREVIOUS_5 *
(1 + B.PREVIOUS_6 *
(1 + B.PREVIOUS_7 *
(1 + B.PREVIOUS_8 *
(1 + B.PREVIOUS_9 *
(1 + B.PREVIOUS_10 *
(1 + B.PREVIOUS_11 *
(1 + B.PREVIOUS_12 ))))))))))) as StraightMonths
) as straightMonthsSubquery
) group by StraightMonths
... а затем используя , что , как подзапрос, чтобы получить конкретный интересующий вас месяц;просто запомните, если вы хотите, чтобы month = 2, вы должны SUM () значения для StraightMonths> = 2 (значение в записи 2 - это только те, которые имели ровно два месяца.) Или даже простопоместите эти данные из запроса в таблицу temp / variable (в ней всего 12 строк с одним столбцом.)