【问题标题】:JOIN 2 select queries FROM ONE TABLEJOIN 2 从一张表中选择查询
【发布时间】:2012-11-23 23:50:17
【问题描述】:

我有一个名为 journal 的表。 日记有 4 列:

  1. 日期(日期)
  2. 帐户(整数)
  3. Type(varchar(1)(可接受字符 D 或 C)
  4. 金额(十进制(18,2))

杂志

Date         Account    Amount    Type
2012-05-31   20001      300       D
2012-05-31   20002      700       C
2012-05-31   20003      600       D
2012-05-31   20004      900       C

类型列只能取 2 种类型的字符值:D 或 C。 所以我需要一个查询,它会给我 4 列,这样结果列是:

Date        Account       D       C
2012-05-31  200101        300     0
2012-05-31  200102        0       700
2012-05-31  200103        600     0
2012-05-31  200104        0       900

D 和 C 列填充了来自 Amount 的值,无论它们是否为空。

【问题讨论】:

  • 您使用的是什么数据库?他们中的一些人对这类事情有一个 PIVOT 关键字。

标签: sql sql-server


【解决方案1】:

您可以通过PIVOT 完成此操作:

create table journal
(
    date datetime,
    account int,
    amount money,
    type varchar(1)
)

insert into journal values ('05/31/12', 20001, 300, 'D')
insert into journal values ('05/31/12', 20002, 700, 'C')
insert into journal values ('05/31/12', 20003, 600, 'D')
insert into journal values ('05/31/12', 20004, 900, 'C')

select date
    , account
    , isnull([D], 0) as D
    , isnull([C], 0) as C
from 
(
    select *
    from journal
) x
pivot
(
    sum(amount)
    for type in ([D], [C])
) p

drop table journal

查看SQL Fiddle 的演示

如果您想加入帐户名称,那么您需要在该表上执行 JOIN。使用演示查看更新SQL Fiddle:

select date
    , account
    , name
    , isnull([D], 0) as D
    , isnull([C], 0) as C
from 
(
    select *
    from journal j
    inner join account a
      on j.account = a.id
) x
pivot
(
    sum(amount)
    for type in ([D], [C])
) p

【讨论】:

  • @bluefeet ......这正是我想要的,你只是一针见血......但还有一件事......我如何链接到一个名为 Accounts 的父表journal 表的 account 列与 Accounts 表的 ID 相同,other 获取账户名。
  • @froodo 我更新了我的答案,你会想为另一个表添加一个联接。
  • @bluefeet...是的,但是在这个查询中我将在哪里进行连接查询,因为这是我第一次看到 PIVOT 语法或语句。
【解决方案2】:
SELECT DATE,
       account,
       CASE
         WHEN TYPE = 'D' THEN
          amount
         ELSE
          0
       END D,
       CASE
         WHEN TYPE = 'C' THEN
          amount
         ELSE
          0
       END C TYPE
  FROM JOURNAL

【讨论】:

  • 我不得不把“类型”这个词去掉,但后来效果很好。我只是从上面剪切并粘贴到小提琴中。
【解决方案3】:

您是否正在尝试做这样的事情?

SELECT
    SUM(CASE [Type] WHEN 'C' THEN [Amount] ELSE 0 END) AS C
    ,SUM(CASE [Type] WHEN 'D' THEN [Amount] ELSE 0 END) AS D
    ,[Date]
    ,[Account]
FROM
    Journal
GROUP BY
    [Date]
    ,[Account]

这将对日期/帐户组合的每个值的金额求和。您可以将 SUM 聚合替换为您选择的任何聚合(MIN、MAX 等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2017-12-23
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多