【问题标题】:how to Roll multiple rows into a single row and column inspecific order in for SQL Server如何在 SQL Server 中按特定顺序将多行滚动到单行和列中
【发布时间】:2017-02-02 09:27:31
【问题描述】:

我的 Sql Server 数据库中有两个表 pay_tbl 和 bill_tbl,它们的列是


pay_tbl{pay_id typy int --pk, pay_name type varchar} bill_tbl{pay_id type int --> Fk,bill_date type datetime,bill_amount type int,bill-status type varchar}


我正在尝试使用月份名称获取每个 pay_ID 的最后 5 个月的账单历史记录,我尝试了一个运行良好的查询并逐行返回每个月的历史记录,但我不想要这个,它返回给我的结果是这边


pay_ID          Month            Amount To Pay    Bill Status
----------      -------------    --------------  -----------
1               January           5000           paid
1               December          6000           Not Paid
2               January           3000           paid
2               December          800            Not Paid

但我想要这样的结果

pay_ID Month  Amount To Pay Bill Status   Month  Amount To Pay    Bill Status

1  January      5000           paid      December 6000            Not Paid
2  January      3000           Paid  December 800            Not paid

我怎样才能做到这一点?我试过的这个查询返回了我上面的结果

SELECT    DATENAME(month, b.bill_date) AS 'Month',b.bill_amount as 'Amount   To Pay', b.bill_status AS 'Bill Status'
 FROM  bill_tbl b
INNER JOIN
          pay_tbl AS p ON b.payment_id = p.pay_ID

【问题讨论】:

  • 11 月发生了什么以及为什么需要这样的结果
  • 更好的是,在您的表示层中执行此操作。如果您在 SQL 查询中确实需要这个,请检查关键字 PIVOT...
  • 我只是以 11 月为例,我需要在 gridview 中显示,这意味着每一行都有一个支付 ID
  • 在输出中显示的是 5000 年和 2000 年 1 月,但在样本数据 5000 和 3000 中。
  • @mohan111 你有解决方案吗?我刚刚输入了虚拟示例并忘记了具有相同的值,但我确定你明白我想要什么

标签: sql-server database subquery


【解决方案1】:

样本数据:

DECLARE @Table1  TABLE 
        (pay_ID int, Month varchar(8), AmountToPay int, BillStatus varchar(8))
    ;

    INSERT INTO @Table1
        (pay_ID, Month, AmountToPay, BillStatus)
    VALUES
        (1, 'January', 5000, 'paid'),
        (1, 'December', 6000, 'Not Paid'),
        (2, 'January', 3000, 'paid'),
        (2, 'December', 800, 'Not Paid')
    ;

脚本

;WITH CTE AS (
select *, row_number()OVER(PARTITION BY pay_ID ORDER BY (SELECT NULL))RN from @Table1 )
,CTE1 AS (
Select * from  CTE where RN = 1 )
,CTE2 AS (
Select * from  CTE where RN = 2 )


Select row_number()OVER(PARTITION BY J_Month  ORDER BY (SELECT NULL)) AS ID,
J_Month,
J_AmountToPay,
J_BillStatus,
D_Month,
D_AmountToPay,
D_BillStatus 
    from (
    select  
            C.pay_ID J_pay_ID,
            C.Month J_Month,
            C.AmountToPay J_AmountToPay,
            C.BillStatus J_BillStatus,
            CC.Month D_Month,
            CC.AmountToPay D_AmountToPay,
            CC.BillStatus D_BillStatus,
            row_number()OVER(PARTITION BY CC.pay_ID  ORDER BY (SELECT NULL))RNN 
from CTE1 C,CTE2 CC
)T WHERE T.RNN  = 1

【讨论】:

  • 一月和十二月只有两个月?
  • 这就是你所要求的。你现在能明白为什么@Mohan111 要求提供更多细节了吗?
  • @destination-data 更详细?像 ??你能解释一下吗?我应该和你分享我的整个项目然后你就会知道所有细节吗?
  • @destination-data 我们已经根据他提供的数据回答了他的问题。更何况他不愿意遵循 SO Pattern 。反正他是个新手.cheers
  • 关于 SO 的问题很多。他们都在争夺注意力。因此,更简单的问题更有可能得到答案。如果您需要帮助,您的工作就是让您的问题尽可能容易回答。这需要时间和精力。阅读 MCVE。浏览帮助页面。 (@Mohan111 - 我喜欢这个答案。干得好!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2021-04-20
相关资源
最近更新 更多