【问题标题】:Is it possible to select a column from a database and not display it in the result set - if selected, causes an issue with Group By是否可以从数据库中选择一列而不将其显示在结果集中 - 如果选择,会导致 Group By 出现问题
【发布时间】:2018-01-23 10:25:09
【问题描述】:

我有一个正在我的应用程序中使用的查询。我不得不对它进行一个小的编辑(选择一个额外的列),现在我这样做了,我没有得到相同的结果,因此我得到了一个错误的文件。举个例子,这就是查询的样子......

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
From //Doing some joins here
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks

结果集为我提供了许多记录,但按具有相同 X、Y、Z、W 的记录进行分组 - 所以没有 Group By 它看起来像这样

X                Y                 Z                  W
-----------------------------------------------------------
123              Anton             772                0
123              Anton             772                0

显然,随着 group by 他们被卷成一个...

当我尝试在我的 Select 查询中包含一个附加列时,问题就出现了。我需要这个查询,因为我需要在我的代码中赋值才能区分它是什么类型的记录。对于新列,这两行数据不相同,因此不会汇总。

有没有办法让我以某种方式添加一个额外的列,但不显示它,并将其从Group By 中排除?

这就是我的意思

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
    'P' = tblC.Proc     -- New column
From //Doing some joins here
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks,
    tblC.Proc       -- New column

在这种情况下,数据如下所示

X                Y                 Z                  W          P
---------------------------------------------------------------------
123              Anton             772                0          FPN
123              Anton             772                0          PPN

现在 P 对于之前汇总为一个的 2 条记录是不同的,有没有办法让我以某种方式不显示 P,但是,仍然能够从我的记录集中获取它的值。如果在这一查询中没有选择“P”,我将无法选择它,并且由于两条记录没有汇总,我遇到了一些重大问题。

基本上我需要选择“P”,但不将其包含在我的结果集或分组依据中。

任何帮助将不胜感激。

【问题讨论】:

  • 如果每一行的值都不同,并且您仍然希望它们汇总成一行,那么处理器应该如何决定将两个不同值中的哪一个包含在汇总行中?不,您不能在一个结果集中执行此操作。您需要对其他非汇总结果集执行单独的查询。或者,如果您只想将 P 记录汇总起来,只需添加只汇总 P 行的 Where 子句。
  • 不使用聚合函数时为什么要 GROUP BY?您是否尝试执行 SELECT DISTINCT?
  • “我需要选择'P'但不将其包含在我的结果集中”是什么意思?您认为选择某些内容并将其包含在结果集中有什么区别?从样本数据中添加您想要的结果可能会有所帮助。如果你想“从你的记录集中获得它的价值”,你希望它是什么价值?

标签: sql sql-server-2012 group-by


【解决方案1】:

如果您只希望第一个 DISTINCT 四列有一条记录,您要显示 P 列中的哪一个?

如果您对此问题有答案,只需添加到查询中

Where tblC.Proc = -->YOUR_EXPECTED_VALUE_OR_CONDITION_HERE<--

【讨论】:

    【解决方案2】:

    我猜有几个选项...没有真正的方法来获取值而不将它们包含在结果中。否则你会如何阅读它们?

    一种方法是将STUFF 'P' 的值放入逗号分隔的列表中,即:

    X                Y                 Z                  W          P
    123              Anton             772                0          FPN,PPN
    

    然后在您的应用程序中读取它们,用逗号分隔。在这里阅读:https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server

    如果“P”没有太多选项或者您知道所有选项,则另一种方法是创建布尔标题。您可以使用CASE 语句创建它们,例如:

    ,SUM(CASE WHEN tlbc.Proc = 'PPN' THEN 1 ELSE 0 END) AS "PPN"
    

    编辑:在它周围省略了一个聚合,因此它可以正确分组。可以将 MAX 用于 1 或 0,以及...取决于 tlbc.Proc 可以有多少结果。围绕您的案例的一些聚合函数会将您的行合并为一个。

    对于类似的结果:

    X                Y                 Z                  W          FPN          PPN          AnotherP
    123              Anton             772                0          1          1          0
    

    第三,如果我误读了您的问题并且您不需要这些值而只需要它们在 WHERE 中,那么不要显示它们。

    肯定有更多的方法可以解决这个问题。

    这有帮助吗?

    【讨论】:

    • 感谢您的建议
    • @BobSki 没有问题!如果其中任何一个不适用于您的具体情况,请告诉我,我们可以尝试考虑其他方法。
    【解决方案3】:

    您需要在 P 上执行某种聚合函数,因此您不需要对其进行分组。如果您只关心其中一个值,则可以使用 MIN() 或 MAX() 来获取其中一个。

    所以,类似:

    SELECT X, Y, Z, MAX(P) AS P etc....
    

    另一种方法是使用 FOR XML PATH 之类的方法将值转换为单个值(可能是逗号分隔的列表)。网上有很多人这样做的例子。这是一个例子:

    https://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation

    【讨论】:

    • 感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多