Zaur Bahramov Ответов: 2

TSQL: найти нечетные и четные числа в каждом столбце для всех строк


У меня есть таблица с 6 столбцами, содержащими случайные числа от 1 до 90.

nr1 nr2 nr3 nr4 nr5 nr6
-----------------------
12  26  70  74  84  87
6   13  19  37  67  72
29  31  35  49  69  74
3   14  30  50  66  87
6   10  13  17  22  46
28  29  33  35  65  80
25  31  43  61  63  86
12  20  22  39  55  72
9   12  28  71  82  85
5   13  28  30  42  63
33  37  48  65  83  84
3   10  40  54  69  85
6   19  30  53  55  76
17  41  42  43  66  76
2   22  28  39  61  79
26  37  53  81  86  90
2   51  55  57  61  82
1   18  30  34  65  75
18  28  40  63  68  86

Мне нужно создать запрос, который даст следующий результат:
Total ODD numbers in a table: 
Total EVEN numbers in a table: 
Total number of rows containing 6 even numbers:
Total number of rows containing 6 odd numbers:
Total number of rows containing 5 even and 1 odd number:
Total number of rows containing 5 odd and 1 even number:
Total number of rows containing 4 even and 2 odd numbers:
Total number of rows containing 4 odd and 2 even numbers:
Total number of rows containing 3 even and 3 odd numbers:

Есть идеи? Спасибо!

Что я уже пробовал:

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

SELECT COUNT(*) AS ROWS_ODDS FROM table
  WHERE nr1 %2!=0 AND nr2 %2!=0 AND nr3 %2!=0 AND nr4 %2!=0 AND nr5 %2!=0 AND nr6 %2!=0

  SELECT COUNT(*) AS ROWS_EVENS FROM table
  WHERE nr1 %2=0 AND nr2 %2=0 AND nr3 %2=0 AND nr4 %2=0 AND nr5 %2=0 AND nr6 %2=0

2 Ответов

Рейтинг:
2

Richard Deeming

Начните с простых запросов:

Всего нечетных чисел в таблице:

SELECT
    SUM((nr1 & 1) + (nr2 & 1) + (nr3 & 1) + (nr4 & 1) + (nr5 & 1) + (nr6 & 1))
FROM
    YourTable
;
Всего четных чисел в таблице:
SELECT
    SUM((1 - nr1 & 1) + (1 - nr2 & 1) + (1 - nr3 & 1) + (1 - nr4 & 1) + (1 - nr5 & 1) + (1 - nr6 & 1))
FROM
    YourTable
;
Строки, содержащие шесть четных чисел:
SELECT
    Count(1)
FROM
    YourTable
WHERE
    nr1 & 1 = 0
And
    nr2 & 1 = 0
And
    ...
Строки, содержащие шесть нечетных чисел:
SELECT
    Count(1)
FROM
    YourTable
WHERE
    nr1 & 1 = 1
And
    nr2 & 1 = 1
And
    ...

Теперь немного более сложные запросы:

5 четных и 1 нечетное:
SELECT
    Count(1)
FROM
    YourTable
WHERE
    (nr1 & 1) + (nr2 & 1) + (nr3 & 1) + (nr4 & 1) + (nr5 & 1) + (nr6 & 1) = 1
;
Вы должны быть в состоянии работать с другими оттуда. :)


Zaur Bahramov

Привет, Ричард! Что означает nr1 & 1?

Richard Deeming

& является побитовым оператором и:
& (побитовое и) (Transact-SQL) - SQL Server | Microsoft Docs[^]

Все нечетные числа будут иметь бит 1 установить, так @x & 1 будет возвращать 1. Все четные числа не будут иметь этого набора битов, так что @x & 1 будет возвращать 0.

Рейтинг:
0

OriginalGriff

Создайте временную таблицу и заполните ее коэффициентами и числами четей: это довольно тривиально, вы можете просто выбрать, чтобы получить их:

SELECT Nr1%2 + Nr2%2 + Nr3%2 + Nr4%2 + Nr5%2 + Nr6%2 AS Odds,
       6 - (Nr1%2 + Nr2%2 + Nr3%2 + Nr4%2 + Nr5%2 + Nr6%2)  AS Evens
INTO #Temp
FROM MyTable
Затем вы можете выбрать то, что вам нужно от этого:
--DROP TABLE IF EXISTS #Temp
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#Temp') 
BEGIN
   DROP TABLE #Temp;
END;
SELECT Nr1%2 + Nr2%2 + Nr3%2 + Nr4%2 + Nr5%2 + Nr6%2 AS Odds,
       6 - (Nr1%2 + Nr2%2 + Nr3%2 + Nr4%2 + Nr5%2 + Nr6%2)  AS Evens
INTO #Temp
FROM MyTable
SELECT 'Total Odds  = ' + CAST(SUM(Odds) AS NVARCHAR) FROM #Temp 
SELECT 'Total Evens = ' + CAST(SUM(Evens) AS NVARCHAR) FROM #Temp 
DROP TABLE #Temp

Закомментированная строка предназначена для SQL2016 и выше, для более низкой версии используйте вторую версию.

Я оставлю другие варианты на ваше усмотрение!