我有下表(tbTest):
| id_main | 手術 | id_cli | 姓名 | 到期日 | 價值 | 債務份額 | 地址 | id_parcel | d1 | d2 | d3 | d4 | d5 | 型別 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 253 | 66 | 9876 | 約翰尼 | 2018-11-01 | 1.2 | 1 | 美國廣播公司街12號 | 7197 | N | |||||
| 253 | 67 | 9876 | 約翰尼 | 2018-11-01 | 3.7 | 4 | 美國廣播公司街12號 | 7198 | N | |||||
| 254 | 68 | 9876 | 約翰尼 | 2017-11-20 | 7.8 | 1 | 美國廣播公司街12號 | 4196 | 是 | |||||
| 254 | 68 | 9876 | 約翰尼 | 2015-11-20 | 9.3 | 1 | 美國廣播公司街12號 | 4670 | 是 | |||||
| 254 | 68 | 9876 | 約翰尼 | 2020-12-22 | 6.0 | 1 | 美國廣播公司街12號 | 5235 | 是 | |||||
| 254 | 68 | 9876 | 約翰尼 | 2016-09-20 | 9.2 | 1 | 美國廣播公司街12號 | 7199 | 是 | |||||
| 254 | 68 | 5432 | 大衛 | 2017-11-20 | 7.8 | 2 | 斧頭大道46號 | 4196 | 是 | |||||
| 254 | 68 | 5432 | 大衛 | 2015-11-20 | 9.3 | 2 | 斧頭大道46號 | 4670 | 是 | |||||
| 254 | 68 | 5432 | 大衛 | 2020-12-22 | 6.0 | 2 | 斧頭大道46號 | 5235 | 是 | |||||
| 254 | 68 | 5432 | 大衛 | 2016-09-20 | 9.2 | 2 | 斧頭大道46號 | 7199 | 是 |
我試圖建立一個查詢得到以下結果:
id_main|operation|id_cli|name |dueDate |value|debtShare|address |id_parcel|d1 |d2 |d3 |d4 |d5|Type|
253| 66| 9876|Johnny|2018-11-01| 1.2| 1|abc street 12| 7197|2018-11-01| | | | |N |
253| 67| 9876|Johnny|2018-11-01| 3.7| 4|abc street 12| 7198|2018-11-01| | | | |N |
254| 68| 9876|Johnny|2015-11-20| 9.3| 1|abc street 12| 4670|2015-11-20|2016-09-20|2017-11-20|2020-12-22| |Y |
254| 68| 5432|David |2015-11-20| 9.3| 2|axe avenue 46| 4670|2015-11-20|2016-09-20|2017-11-20|2020-12-22| |Y |
在該表中,當 Type=Y 時,dueDate 值轉到 d1、d2 等列,按日期排序;當Type=N 時,只有一個dueDate 值,它進入d1 列。
我已經搜索并發現了一個(并非如此)類似的問題。基于它,我試圖做我需要的事情,但沒有成功。
http://sqlfiddle.com/#!18/2144b6/5
有人能幫助我嗎?
提前致謝。
uj5u.com熱心網友回復:
你那里有一些亂七八糟的資料!
SELECT
id_main,
id_operation,
id_cli,
MAX(name),
MIN([duedate]),
MAX(value),
MAX(debtshare),
MAX(address),
MAX(CASE WHEN rnvd = 1 THEN id_parcel END) as id_parcel,
MAX(CASE WHEN rnd = 1 THEN [duedate] END) as d1,
MAX(CASE WHEN rnd = 2 THEN [duedate] END) as d2,
MAX(CASE WHEN rnd = 3 THEN [duedate] END) as d3,
MAX(CASE WHEN rnd = 4 THEN [duedate] END) as d4,
MAX(CASE WHEN rnd = 5 THEN [duedate] END) as d5
-- MAX([type])
FROM
(SELECT *, ROW_NUMBER() OVER(PARTITION BY id_main, id_operation, id_cli ORDER BY value DESC) as rnvd, ROW_NUMBER() OVER(PARTITION BY id_main, id_operation, id_cli ORDER BY [duedate]) as rnd
FROM tbTest
) x
GROUP BY id_main, id_operation, id_cli
ORDER BY 1,2,3 DESC
你的小提琴沒有 [type] 輸入,但我相信你可以添加它/將它調整到你所擁有的
http://sqlfiddle.com/#!18/2144b6/17
uj5u.com熱心網友回復:
這似乎有效,盡管可能有更有效的方法:
with baseRows as (
select distinct id_operation, id_cli FROM tbTest
), dueDates as (
select
row_number() over (partition by id_operation, id_cli order by dueDate) as rn,
id_operation, id_cli, dueDate
from tbTest x
)
SELECT f.*, d1.dueDate, d2.dueDate, d3.dueDate, d4.dueDate, d5.dueDate
FROM baseRows b
CROSS APPLY (SELECT TOP 1 * FROM tbTest WHERE id_operation = b.id_operation and id_cli = b.id_cli) f
INNER JOIN dueDates d1 on d1.id_operation = b.id_operation and d1.id_cli = b.id_cli
and d1.rn = 1
LEFT JOIN dueDates d2 on d2.id_operation = b.id_operation and d2.id_cli = b.id_cli
and d2.rn = 2
LEFT JOIN dueDates d3 on d3.id_operation = b.id_operation and d3.id_cli = b.id_cli
and d3.rn = 3
LEFT JOIN dueDates d4 on d4.id_operation = b.id_operation and d4.id_cli = b.id_cli
and d4.rn = 4
LEFT JOIN dueDates d5 on d5.id_operation = b.id_operation and d5.id_cli = b.id_cli
and d5.rn = 5
ORDER BY id_operation, id_cli
http://sqlfiddle.com/#!18/2144b6/13
注意我忽略id_main了磁區和連接,因為它在示例資料的每條記錄中都是相同的。你可能需要把它放回去。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344753.html
標籤:sql sql-server 查询语句
