【问题标题】:SQL Server : how to combine two select queries from the same table and take the result on ColumnSQL Server:如何组合来自同一个表的两个选择查询并在列上获取结果
【发布时间】:2014-04-29 04:16:07
【问题描述】:

我想在具有 group by 的同一个表上组合两个查询。

这是我的桌子:

 Date#####   |  Value1 |  Value2 |   Value3 | Type
 ------------------------------------------------------
 23/04/2014  |  1,2    |    12,3 |    10    | Green
 23/04/2014  |  11,2   |    3    |   10,3   | Non-Green    
 24/04/2014  |  10,9   |    3    |    11    | Green
 24/04/2014  |  2,3    |    12,3 |    8     | Green
 24/04/2014  |  10     |    1    |    11    | Non-Green
 25/04/2014  |  10     |    2    |   10,8   | Non-Green    
 25/04/2014  |  1,4    |    5    |    12    | Green

这些值为Decimal 类型。计算value1,value2,value3 >= 10。预期结果:

 Date#####   | Green |Non-Green
 ------------------------------
 23/04/2014  |  2    | 2
 24/04/2014  |  3    | 2
 25/04/2014  |  1    | 2

绿色和非绿色的值来自于 value1、value2、value3 的计数 >=10,这是我的第一个查询:

Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"

它显示:

 Date#####   | Cnt |Type
 ------------------------
 23/04/2014  |  2    | Green
 24/04/2014  |  3    | Green
 25/04/2014  |  1    | Green

我的第二个查询:

Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Non-Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"

它显示:

 Date#####   | Cnt |Type
 ------------------------
 23/04/2014  |  2    | Non-Green
 24/04/2014  |  2    | Non-Green
 25/04/2014  |  2    | Non-Green

我想将两个查询合并为一个,并获取日期绿色的结果和非绿色的结果。假设我有很多日期组,我希望它只显示基于ASC 顺序的最后 7 组日期。

有什么办法吗?我尝试查看其他 SO 帖子,例如使用 UNION 或 PIVOT,但我不知道如何在我的代码中实现它。

对不起,我昨天已经发布了这个问题,这是一个预期结果的编辑......

提前谢谢....

【问题讨论】:

  • 检查我的查询以轻松获得输出。
  • 这个问题你问过多少次了?
  • @Mihai 这么多,,,哈哈哈……不好意思,之前效果不好……

标签: sql sql-server select pivot union


【解决方案1】:
SELECT d, 
       sum(CASE WHEN LW = 'Green'     THEN cnt ELSE 0 END) [Green], 
       sum(CASE WHEN LW = 'Non-Green' THEN cnt ELSE 0 END) [Non-Green]
FROM
(
  SELECT [date] AS d, 
  [Type] as LW, 
  CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END +
  CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + 
  CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END AS cnt,
  DENSE_RANK() over (ORDER BY [date] DESC) dr
  FROM tbBooth 
  WHERE Type in ('Green','Non-Green')
) x 
WHERE dr < 8
GROUP BY d
ORDER BY d ASC

【讨论】:

  • 亲爱的克劳森,非常感谢你帮助我......我试过你的代码,它的工作,但它只显示一些数据......
  • @user3567963 再次阅读您的问题后,我明白了您的意思,答案已修改
  • @user3567963 我在内部查询中有一些包含 order by 的旧代码,它已被删除。现在可以使用了
  • 感谢您帮助我...您的代码完美运行...感谢您一直帮助我...
  • 亲爱的 t-clausen 我在我的程序中发现了一些错误。我使用你的 sql 语法,它可以工作。但它只对日期进行排序,不包括月、年。例如 2014 年 9 月 5 日、2014 年 4 月 20 日、2014 年 4 月 21 日。我之前使用过 varchar 数据类型,所以我将其更改为日期数据类型,但是当我在图表上显示它时它给了我不同的结果。结果如下:01/01/1914、01/01/1936、01/01/2002。你知道为什么会变成这样吗?是因为数据库中存储的日期包括日期(09/05/2014 00:00:00)吗?感谢您的帮助。
【解决方案2】:

您可以使用两个 case 语句,每个值一个;在这里,我首先在一个公用表表达式中拆分行以简化案例;

WITH cte AS (
  SELECT date, type, value1 value FROM tbBooth UNION ALL
  SELECT date, type, value2 value FROM tbBooth UNION ALL
  SELECT date, type, value3 value FROM tbBooth
)
SELECT date d, 
  SUM(CASE WHEN type='Green'     AND value>=10.0 THEN 1 ELSE 0 END) Green,
  SUM(CASE WHEN type='Non-Green' AND value>=10.0 THEN 1 ELSE 0 END) NonGreen
FROM cte
GROUP BY [date] 
ORDER BY [date] DESC

An SQLfiddle to test with.

【讨论】:

  • 亲爱的 Joachim,你的代码是有效的......但我希望它只显示基于 ASC 顺序的最后 7 行......在你的代码中它显示所有行......我添加了您的代码中的前 7 名,但仍显示所有行...非常感谢...
【解决方案3】:

试试这个查询,而不是每一列的 case...

Select *
From (
    Select [Date], [Type], COUNT(*) Cnt
    From tbBooth
    UnPivot (Value For Name In ([Value1],[Value2],[Value3])) As UnPvt
    Where Value >= 10
    Group By [Date], [Type]
) As GrpBooth
Pivot (SUM(Cnt) For Type IN ([Green],[Non-Green])) As Pvt

输出是:

Date                    Green       Non-Green
----------------------- ----------- -----------
2014-04-23 00:00:00.000 2           2
2014-04-24 00:00:00.000 3           2
2014-04-25 00:00:00.000 1           2

【讨论】:

  • 如果你喜欢这个查询而不是放弃投票和喜欢答案。提前致谢
  • 您的代码也可以工作...但是当绿色或非绿色之一为空或零时它不会显示...非常感谢您帮助我...
【解决方案4】:

我已尝试获得您所需的输出。请检查一下。

如果我在这里遗漏了什么,请告诉我,以便我更正。

--Simulated your table
DECLARE @tbl TABLE
(
[DATE] DATETIME,
Value1 FLOAT,
Value2 FLOAT,
Value3 FLOAT,
[Type] VARCHAR(50)
)

--Entered values for testing
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/23/2014','1.2','12.3 ','10','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/23/2014','11.2','3','10.3','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','10.9','3','11','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','2.3','12.3 ','8','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','10','1','11','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/25/2014','10','2','10.8','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/25/2014','1.4','5','12','Green')

--your required query
SELECT TOP 7 * FROM
(
    SELECT [date] AS d, 
    SUM(CASE WHEN [Type] = 'Green' AND Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Green' AND Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Green' AND Value3 >= 10 THEN 1 ELSE 0 END) AS Green,
    SUM(CASE WHEN [Type] = 'Non-Green' AND Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Non-Green' AND Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Non-Green' AND Value3 >= 10 THEN 1 ELSE 0 END) AS [Non-Green]   
    FROM @tbl 
    GROUP BY [date]
)x
ORDER BY d ASC

希望对你有帮助

【讨论】:

  • 亲爱的 samar,非常感谢您对我的帮助,我尝试了您的代码,它的工作,但它显示在 Desc 顺序的最后 7 行,我希望它显示在 ASC 顺序,所以我将 DESC 更改为 ASC,但它需要前 7 行...
  • 我想我理解你的问题。我认为它只总结了第一/最后 7 行,而不是表中的所有行。我已经更新了我的答案。请检查并让我知道它是否适合您。如果没有请评论。
  • 它仍然显示在 DESC 订单上,,,您的代码的示例输出:2014 年 4 月 24 日; 2014 年 4 月 23 日;等等……
  • 已经完成了...我稍微更改了您的代码,,,非常感谢您对我的帮助...
  • @samar 当有超过 7 个不同的日期时,这不会给出正确的结果。它不会显示最近的 7 个日期
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2020-10-12
  • 2021-02-08
  • 2017-05-17
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多