Sql 按大小写返回GROUP的行,如果为NULL,则返回(…)ELSE(…),即使记录不存在 让我们考虑下面的场景。 CREATE TABLE Replicant (Name NVARCHAR(10),Gen INT); INSERT INTO Replicant VALUES ('tymtam', 2), ('Roy', 6); SELECT CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END as 'Gen', count(*) as 'Count' FROM Replicant GROUP BY CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END;

Sql 按大小写返回GROUP的行,如果为NULL,则返回(…)ELSE(…),即使记录不存在 让我们考虑下面的场景。 CREATE TABLE Replicant (Name NVARCHAR(10),Gen INT); INSERT INTO Replicant VALUES ('tymtam', 2), ('Roy', 6); SELECT CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END as 'Gen', count(*) as 'Count' FROM Replicant GROUP BY CASE WHEN Gen < 10 THEN '<10' ELSE '>=10' END;,sql,tsql,Sql,Tsql,结果是 Gen Count Known 2 我渴望 Gen Count Known 2 Unknown 0 更新1 我的背景是,我为不同代的复制者提供了成对的查询度量: INSERT INTO [dbo].[Metrics] (...) SELECT 'Metric X for >=10' as 'Name', COUNT(*) AS 'Count', (80_char_expression) AS 'Sum', (80_char_expression) AS

结果是

Gen     Count
Known   2
我渴望

Gen     Count
Known   2
Unknown 0
更新1 我的背景是,我为不同代的复制者提供了成对的查询度量:

INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for >=10' as 'Name',
COUNT(*) AS 'Count',
(80_char_expression) AS 'Sum',
(80_char_expression) AS 'Min',
(80_char_expression) AS 'Max', 
0 AS 'StandardDeviation'
FROM Replicant  
WHERE TimestampUtc > DATEADD(WEEK, -1, Current_Timestamp)
AND Gen >= 10

INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for <10' as 'Name',
--7 lines repeated from the 1st query
AND Gen < 10
即使没有记录,我也希望用一个select插入两行。

您可以尝试使用UNOALL为您的分数创建一个比较表,然后进行外部联接

问题1:

:

您可以使用左联接:

您还可以使用条件聚合和取消激励:

select v.*
from (select sum(case when r.gen < 10 then 1 else 0 end) as gen_1,
             sum(case when r.gen >= 10 then 1 else 0 end) as gen_2
      from replicant r
     ) r cross apply
     (values (gen_1, '<10'), (gen_2, '>=10')
     ) v(cnt, gen);

使用join和union是可行的,但是如果不使用它们,这将是一个挑战。谢谢,我更新了我的问题。我希望避免重复select参数。第二个查询返回4行。@tymtam。非常感谢。
Gen     Count
Known   2
Unknown 0
INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for >=10' as 'Name',
COUNT(*) AS 'Count',
(80_char_expression) AS 'Sum',
(80_char_expression) AS 'Min',
(80_char_expression) AS 'Max', 
0 AS 'StandardDeviation'
FROM Replicant  
WHERE TimestampUtc > DATEADD(WEEK, -1, Current_Timestamp)
AND Gen >= 10

INSERT INTO [dbo].[Metrics] (...) SELECT
'Metric X for <10' as 'Name',
--7 lines repeated from the 1st query
AND Gen < 10
SELECT t1.word,
       COUNT(Name) 'Count'
FROM
(
SELECT '<10' word,9 maxval,0 minval
UNION ALL
SELECT '>=10' word,2147483646 maxval,10 minval
) t1 LEFT JOIN Replicant on Gen BETWEEN t1.minval AND t1.maxval
GROUP BY t1.word
| word | Count |
|------|-------|
|  <10 |     2 |
| >=10 |     0 |
SELECT v.Gen, COUNT(r.gen) as cnt
FROM (VALUES (NULL, 10, '<10'),
             (10, NULL, '>=10')
     ) v(lo, hi, gen) LEFT JOIN
     Replicant r
     ON (r.gen >= v.lo OR v.lo IS NULL) AND
        (r.gen < v.hi OR v.hi IS NULL)
GROUP BY v.gen;
select v.*
from (select sum(case when r.gen < 10 then 1 else 0 end) as gen_1,
             sum(case when r.gen >= 10 then 1 else 0 end) as gen_2
      from replicant r
     ) r cross apply
     (values (gen_1, '<10'), (gen_2, '>=10')
     ) v(cnt, gen);