【问题标题】:Need both the lines in one single query在一个查询中需要这两行
【发布时间】:2018-12-28 03:10:18
【问题描述】:

我的 as 语句应该是“statementmessage”,它是标题行,并且消息 1 和消息 2 应该通过连接在单行中。 如果有任何疑问让我知道,请帮助我。

           WITH with_stmt_bills as (
                   SELECT 

                       BarStatement_Accounts_AcctMsgText.TextID,
                       BarStatement_Accounts_AcctMsgText.TextSeqID,
                         CASE 
                           WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=0 
                           THEN BarStatement_Accounts_AcctMsgText.TextLine
                           END AS Message1,
                         CASE
                           WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=1
                           THEN BarStatement_Accounts_AcctMsgText.TextLine
                           ELSE ''
                           END AS Message2,
         CONCAT(ISNULL('Message1',''),' ',ISNULL('Message2','')) as StatementMessage,

-----------使用语句 2 --------- -------

                     full_stmt_bills as (

                           (SELECT top 1 Message1 FROM with_stmt_bills
                                    WHERE VisitID = internal_table.VisitID
                                    AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
                                    ORDER by TextID desc) as Message1,

                            (SELECT top 1 Message2 FROM with_stmt_bills
                                    WHERE VisitID = internal_table.VisitID
                                    AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
                                    ORDER by TextID desc) as Message2,

在这里使用这个 concat 在列中显示输出为 message1 消息 2,我实际上需要输出存储在消息 1 和消息 2 中的数据

          (select CONCAT(ISNULL('Message1',''),' ',ISNULL('Message2',''))) as StatementMessage,

【问题讨论】:

  • 您希望它是单行中的两列还是单列中的两行?
  • 现在我们有一个名为 'statement message' 的列名,但是当我运行查询时它只显示一半消息,因为消息 1 和 2 是根据 textseqID 分类的
  • 这应该回答我的问题吗?那是什么意思?在这里提供帮助应该非常简单,但是发布的信息还不够。
  • CASE WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=0 THEN BarStatement_Accounts_AcctMsgText.TextLine END AS Message1, CASE WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=1 THEN BarStatement_Accounts_AcctMsgText.TextLine ELSE '' END AS Message2,
  • 请不要将代码放入 cmets。这是您问题的一部分,应该在问题中发布。

标签: sql sql-server sql-server-2008 tsql ssms


【解决方案1】:

给你!

SELECT
    (SELECT top 1 Message1 FROM with_stmt_bills
     WHERE VisitID = internal_table.VisitID AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
     ORDER by TextID desc)
     + ' ' + 
    (SELECT top 1 Message2 FROM with_stmt_bills
     WHERE VisitID = internal_table.VisitID AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
     ORDER by TextID desc
    ) AS statementmessage

当然,如果您实际上是从同一列的同一行中提取信息,则可以简化此操作。

SELECT Message1 + ' ' + Message2 AS statementmessage
FROM with_stmt_bills
WHERE VisitID = internal_table.VisitID AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
ORDER by TextID desc

【讨论】:

  • 如果这是他们想要做的事情,真的不需要使用两个查询。
  • 非常正确。可能查询被简化了,提问者复制/粘贴了相同的查询。
  • Msg 207, Level 16, State 1, Line 301 列名“StatementMessage”无效。
  • 您是否使用了区分大小写的排序方法?
【解决方案2】:

使用+ 完成连接:

(SELECT top 1 Message1 + Message2 FROM with_stmt_bills
 WHERE VisitID = internal_table.VisitID
   AND with_stmt_bills.LedBillDateID = internal_table.LedBillDateID
 ORDER by TextID desc) as Message1and2

在 OP 编辑​​后添加:

编辑帖子后,第一个代码块(只是 CTE 的一个片段)没有用,因为您似乎试图连接两个字符串(Message1 和 Message2),其中最多一个不会为空(因为TextSeqID 不能同时是 01)。尽管如此,ISNULL('Message1','') 将始终返回字符串“Message1”。确定您的意思是ISNULL(Message1,''),但这不起作用,因为您不能直接在其他计算列中引用计算列。

在您的第二个查询片段中,完全不清楚full_stmt_bills 是什么。它是另一个 CTE 吗?不,因为定义只包含 2 个值但没有 VALUES 子句。您似乎定义了 2 个完全不同的 Message1 和 Message2 列。那么 Whiskey Tango Foxtrott 您是否要连接以形成连接字符串?我为您的第二个代码片段提供了分析器,对于第一个(新的)代码片段,它将是 Message1 或 Message2,所以:

WITH with_stmt_bills as (
  SELECT 

    BarStatement_Accounts_AcctMsgText.TextID,
    BarStatement_Accounts_AcctMsgText.TextSeqID,
    CASE 
      WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=0 
      THEN BarStatement_Accounts_AcctMsgText.TextLine
    END AS Message1,
    CASE
      WHEN BarStatement_Accounts_AcctMsgText.TextSeqID=1
      THEN BarStatement_Accounts_AcctMsgText.TextLine
      ELSE ''
    END AS Message2,
    CASE 
      WHEN BarStatement_Accounts_AcctMsgText.TextSeqID IN (0, 1) 
      THEN BarStatement_Accounts_AcctMsgText.TextLine
      ELSE ''
    END AS StatementMessage,

【讨论】:

  • Msg 207, Level 16, State 1, Line 301 列名“StatementMessage”无效。
  • Msg 207, Level 16, State 1, Line 301 列名“StatementMessage”无效。现在它说这个错误,在下面的查询中我选择了 distinct 并且它在 full_stmt_table 中被描述为完整的 _stmt_bills.statementMessage,
  • 该消息指向您的查询的一部分,该部分不是您帖子的一部分,因此不涉及我在回答中产生的任何内容。
  • @skumar 刚刚编辑了我的回复。如果你一直坚持发布相互矛盾的代码片段并用无法追踪的错误消息进行评论,那么答案将一直不令人满意。
  • 好的,exatcly 可以共享我的整个代码。它就像 500 行一样
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2015-04-07
  • 2011-04-25
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多