Sql 在一个select查询中组合两行

Sql 在一个select查询中组合两行,sql,sql-server,Sql,Sql Server,嗨,我很难在一个查询中合并来自一个表的两条记录。其思想是,DATE_字段列是日期类型,ColA是整数数据类型 为了进一步说明我的询问,我附上了下面的图片 一,。这是一张未加工的桌子。 2.是所需的输出 另外,日期字段的过滤器在子句中不是一个简单的WHERE DATE_字段 例如,我想得到日期字段=12/30/2013。然后,我还需要通过使用我从web上获得的查询,以编程方式获取上一个“9月日期”字段,即2013年9月30日: CASE WHEN MONTH(DATE_F

嗨,我很难在一个查询中合并来自一个表的两条记录。其思想是,DATE_字段列是日期类型,ColA是整数数据类型

为了进一步说明我的询问,我附上了下面的图片

一,。这是一张未加工的桌子。 2.是所需的输出

另外,日期字段的过滤器在子句中不是一个简单的WHERE DATE_字段

例如,我想得到日期字段=12/30/2013。然后,我还需要通过使用我从web上获得的查询,以编程方式获取上一个“9月日期”字段,即2013年9月30日:

CASE 
            WHEN MONTH(DATE_FIELD) < 10 
            THEN 
            (cast(CAST((DATE_FIELD)  - 1) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
            ELSE 
            ( cast(CAST((YEAR(DATE_FIELD)) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
END
以下是我当前的sql脚本,它无法获取以前的Sept筛选器的等效ColA:

SELECT DATE_FIELD, ColA, 
CASE 
WHEN MONTH(DATE_FIELD) < 10 
 THEN 
 (cast(CAST((YEAR(DATE_FIELD) - 1) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
 ELSE 
 ( cast(CAST((YEAR(DATE_FIELD)) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
END AS PREVIOUS, 
(
 SELECT ColA 
 FROM TABLE_A
 WHERE DATE_FIELD = 
 CASE 
  WHEN MONTH(DATE_FIELD) < 10 
  THEN 
  (cast(CAST((YEAR(DATE_FIELD) - 1) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
  ELSE 
  ( cast(CAST((YEAR(DATE_FIELD)) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
  END
) AS PYE_colA
FROM TABLE_A
WHERE DATE_FIELD = '12/30/2013'

谢谢

对同一个表进行交叉连接,并仅在where子句中使用您的大小写结构:

SELECT a.DATE_FIELD AS DATE_FIELD_1,
    a.ColA AS ColA_1,
    b.DATE_FIELD AS DATE_FIELD_2,
    b.ColA AS ColA_2
FROM TABLE_A a 
CROSS JOIN TABLE_A b
WHERE DATE_FIELD_1 = 'your date'
AND DATE_FIELD_2 = (
    CASE 
    WHEN MONTH(DATE_FIELD_1) < 10 
    THEN 
        (cast(CAST((YEAR(DATE_FIELD_1) - 1) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
    ELSE 
        ( cast(CAST((YEAR(DATE_FIELD_1)) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
    END)
;
根据Thorsten Kettner的评论,另一种可能性是:

SELECT a.DATE_FIELD AS DATE_FIELD_1,
    a.ColA AS ColA_1,
    b.DATE_FIELD AS DATE_FIELD_2,
    b.ColA AS ColA_2
FROM TABLE_A a 
INNER JOIN TABLE_A b
ON b.DATE_FIELD = (
    CASE 
    WHEN MONTH(a.DATE_FIELD) < 10 
    THEN 
        (cast(CAST((YEAR(a.DATE_FIELD) - 1) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
    ELSE 
        ( cast(CAST((YEAR(a.DATE_FIELD)) as char(4)) + RIGHT('00' + LTRIM(09),2) + RIGHT('00' + LTRIM(30),2) AS Date))
    END)
WHERE a.DATE_FIELD = 'your date'
;

在这种情况下,IMO认为,查询的输出到哪里很重要,因为以这种方式组合数据不一定是最优的。如果您计划向用户显示,那么您不希望在查询中以这种方式组合,而希望在UI上组合。如果它需要进入另一个数据库,从您的问题中不清楚数据组合的依据是什么。请用文字说明您希望如何组合数据,而不是代码,即如何将选定日期组合在同一行中。嗨,Omer,主要目标是获得选定日期和等效数据之间的平均值。我将更新图像以描述如何选择要组合的行。我不明白您是如何获得数据的。你从“12/30/2013”开始。该日期有两条记录。为什么显示99而不是0?这是否与您在查询中未使用的StoreID有关?那么你是如何从“2013年12月30日”到“2013年9月30日”的呢?它总是给定月份的最后一天减去三吗?或者你如何到达9月,尤其是9月30日?顺便说一句,这不是一个真正的交叉连接。这是一个内部连接:b.DATE\u字段=案例a.DATE\u字段。。。。您应该改为使用内部联接,并将子句移动到ON,以更清楚地显示您正在执行的操作。此外,在我看来,您在WHERE子句中使用DATE_字段_1/2而不是a/b.DATE_字段会使事情变得有点混乱,这将更清楚地显示您是如何自联接表的。在我看来,首先它是一个交叉联接,然后它的行仅限于与我的WHERE子句匹配的行。我理解错了吗?是的。交叉联接是指不相关地联接两个表。你建立了一个所谓的笛卡尔积。然而,当您关联地连接两个表时,就有了如何匹配它们的记录的标准,实际上您进行了一次内部连接。只有你对读者隐藏这一点,比如模仿a,b中不推荐使用的语法,其中a.x=b.y。不要这样做。我不久前尝试过交叉连接,它成功了。当Thorsten就内部连接发表评论时,它也起了作用。谢谢你们两位!好的,谢谢你的解释。那么,还有什么应用程序可以使用简单的交叉连接呢?