【问题标题】:How to get join multiple queries如何加入多个查询
【发布时间】:2015-04-11 12:34:50
【问题描述】:

http://sqlfiddle.com/#!6/aa0e17/4 中,您可以看到 id 是主键并自动递增,而 values 列是 int 类型。要根据值检索计数,我正在执行 4 个不同的查询

select count(id) from status where value=1
select count(id )from status where value=2
select count(id) from status where value=3
select count(id) from status where value=4

我的要求是在单个查询中获取所有这些计数。

我为什么要?

上表只是一个演示表,只有 4 个查询,但在我的场景中,我有 35 个查询,所以我必须在 java 中执行 35 个方法。

预期输出:4,,4,4,4(第一个查询结果,第二个查询结果,第三个查询结果,第四个查询结果)

【问题讨论】:

  • 请发布预期的输出格式。
  • @wewestthemenace 请立即查看
  • 那么,您期望单行输出?
  • @wewestthemenace 是的。只在sql中完成也没关系,如果您知道如何在这种情况下使用存储过程,那么也请回答

标签: sql sql-server sql-server-2012


【解决方案1】:
select value, count(id)
from status 
group by value

【讨论】:

  • 感谢您的回答,但在我的情况下我必须使用 where 条件。在小提琴中我只提供了一个参数(id),但在我的情况下有 2 或 3 个参数(但在所有 id 参数中很常见)
【解决方案2】:

这里有两种常见的解决方法:

示例 1 PIVOT:

SELECT [1] count1,[2] count2,[3] count3,[4] count4
FROM  
( 
  SELECT id, value 
  FROM status
) p 
PIVOT (COUNT(id) FOR [value] IN ([1], [2], [3], [4])) AS pvt 

如果要将列合并为一个,请使用CONCAT

为此,请将第一个示例中的第一行替换为:

SELECT CONCAT([1],',',[2],',',[3],',',[4])

示例 2 案例:

SELECT 
  COUNT(CASE WHEN value = 1 THEN 1 END) count1,
  COUNT(CASE WHEN value = 2 THEN 1 END) count2,
  COUNT(CASE WHEN value = 3 THEN 1 END) count3,
  COUNT(CASE WHEN value = 4 THEN 1 END) count4
FROM status

【讨论】:

    【解决方案3】:

    您应该通过以下查询更好地计算行数并按值分组:

    SELECT COUNT(*) FROM status GROUP BY value
    

    或者为了更好的描述,试试这个:

    SELECT value, COUNT(*) AS COUNT FROM status GROUP BY value
    

    【讨论】:

    • 如果我只需要比较一列(id)就可以了,如果我还必须与其他列比较怎么办
    • 只需将它们都添加到 select(如果需要)和 group by(必须!!!)子句中。有关使用 GROUP BY 子句的更多详细信息,请参阅msdn.microsoft.com/en-us/library/ms177673.aspx
    • 我希望使用这个模式:create table status(id int primary key IDENTITY(1,1),value int, category int);插入状态值(1, 1),(2, 1),(3, 2),(4, 2),(1, 3),(2, 2),(3, 1),(4, 1 ),(1, 1),(2, 1),(3, 2),(4, 2),(1, 1),(2, 2),(3, 2),(4, 2)
    • 使用此查询:提供更多帮助:SELECT value, category, COUNT(*) AS COUNT FROM status GROUP BY value, category
    • 这只是一个虚拟表和所有虚拟值。所以我只是与一个参数进行比较
    【解决方案4】:

    使用UNION(或UNION ALL 保留重复值)如:

    select count(id) from status where value=1
    UNION
    select count(id )from status where value=2
    UNION
    select count(id) from status where value=3
    UNION
    select count(id) from status where value=4
    

    在这里查看类似的问题:https://stackoverflow.com/a/6066234

    [编辑 1]

    检查小提琴,它可以在我的机器上运行;)http://sqlfiddle.com/#!6/b89ef/1/0

    因为我从插入中删除了 (3),所以你得到了 4,3(我在这里只选择四和三)。

    [编辑 2]

    我没有在一行中抓住你想要的部分。

    只需将SELECT 包裹在您的语句周围,例如http://sqlfiddle.com/#!6/aa0e17/34/0

    select
      (select count(id) from status where value=1),
      (select count(id) from status where value=2),
      (select count(id) from status where value=3),
      (select count(id) from status where value=4)
    ;
    

    您的结果是一行,结果为 4,4,4,4。

    【讨论】:

    • union 丢弃不明确的值,因此使用他的示例,您只会得到一个结果行和一列。
    • 然后使用 Union All 保留重复项。
    • 你的回答很有用,所以+1
    【解决方案5】:

    如果您要查找的是逗号分隔的字符串,那么这可能会有所帮助:

    WITH CTE(N) AS(
        SELECT COUNT(ID) FROM STATUS WHERE VALUE=1 UNION ALL
        SELECT COUNT(ID )FROM STATUS WHERE VALUE=2 UNION ALL
        SELECT COUNT(ID) FROM STATUS WHERE VALUE=3 UNION ALL
        SELECT COUNT(ID) FROM STATUS WHERE VALUE=4 UNION ALL
    )
    SELECT STUFF((
        SELECT N', ' + CONVERT(VARCHAR(10), N) 
        FROM CTE FOR XML PATH(''), TYPE
        ).value('text()[1]','nvarchar(max)')
    , 1 , 2 , N'')
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2013-08-06
      • 2021-02-07
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多