【问题标题】:NULLS in select subqueries选择子查询中的 NULLS
【发布时间】:2018-10-14 17:39:32
【问题描述】:

我有两张桌子。一个显示工作模式名称,一个显示每天的工作小时数,每列中都有模式 ID。我希望它链接起来,以便每天的时间显示在一行上。对于每个模式,最多有 28 个,因此任何天数较少的模式都应返回 null。 我使用了以下内容:

SELECT  DISTINCT    tn.pat_nm                                                       AS 'Pattern Name',
                    tn.pat_id                                                       AS 'Pattern ID',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=1)   AS 'Day 1',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=2)   AS 'Day 2',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=3)   AS 'Day 3',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=4)   AS 'Day 4',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=5)   AS 'Day 5',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=6)   AS 'Day 6',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=7)   AS 'Day 7',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=8)   AS 'Day 8',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=9)   AS 'Day 9',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=10)  AS 'Day 10',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=11)  AS 'Day 11',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=12)  AS 'Day 12',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=13)  AS 'Day 13',
                    (select format(td.pat_day_hrs,'HH:mm') where td.pat_day_no=14)  AS 'Day 14'

FROM                trentadm.tpat_nm tn
                    JOIN trentadm.tpat_det td
                        ON td.pat_id=tn.pat_id


ORDER BY            tn.pat_nm

我得到以下结果

有没有办法将每个模式 ID 的所有时间都放在一行上?

提前谢谢你!

【问题讨论】:

  • 轻松帮助您,简化您的示例。 stackoverflow.com/help/mcve
  • 您能提供一些示例数据并期待结果吗?
  • SQL Server、MySQL 还是其他?

标签: sql tsql subquery sql-subselect nested-select


【解决方案1】:

尝试使用PIVOT

SELECT *
FROM
  (
    SELECT tn.pat_nm,tn.pat_id,td.pat_day_no,format(td.pat_day_hrs,'HH:mm') d
    FROM trentadm.tpat_nm tn
    JOIN trentadm.tpat_det td ON td.pat_id=tn.pat_id
  ) q PIVOT(MAX(d) FOR pat_day_no IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14])) p

然后你可以替换标签

SELECT
  pat_nm 'Pattern Name',
  pat_id 'Pattern ID',
  [1] 'Day 1',
  [2] 'Day 2',
  [3] 'Day 3',
  [4] 'Day 4',
  [5] 'Day 5',
  [6] 'Day 6',
  [7] 'Day 7',
  [8] 'Day 8',
  [9] 'Day 9',
  [10] 'Day 10',
  [11] 'Day 11',
  [12] 'Day 12',
  [13] 'Day 13',
  [14] 'Day 14'
FROM
  (
    SELECT tn.pat_nm,tn.pat_id,td.pat_day_no,format(td.pat_day_hrs,'HH:mm') d
    FROM trentadm.tpat_nm tn
    JOIN trentadm.tpat_det td ON td.pat_id=tn.pat_id
  ) q PIVOT(MAX(d) FOR pat_day_no IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14])) p

【讨论】:

  • 有效。非常感谢:)
【解决方案2】:

试试这样:

SELECT  DISTINCT    tn.pat_nm                                                       AS 'Pattern Name',
                    tn.pat_id                                                       AS 'Pattern ID',
                    MAX(CASE WHEN td.pat_day_no=1 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 1',
                    MAX(CASE WHEN td.pat_day_no=2 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 2',
                    MAX(CASE WHEN td.pat_day_no=3 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 3',
                    MAX(CASE WHEN td.pat_day_no=4 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 4',
                    MAX(CASE WHEN td.pat_day_no=5 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 5',
                    MAX(CASE WHEN td.pat_day_no=6 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 6',
                    MAX(CASE WHEN td.pat_day_no=7 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 7',
                    MAX(CASE WHEN td.pat_day_no=8 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 8',
                    MAX(CASE WHEN td.pat_day_no=9 THEN format(td.pat_day_hrs,'HH:mm') END)   AS 'Day 9',
                    MAX(CASE WHEN td.pat_day_no=10 THEN format(td.pat_day_hrs,'HH:mm') END)  AS 'Day 10',
                    MAX(CASE WHEN td.pat_day_no=11 THEN format(td.pat_day_hrs,'HH:mm') END)  AS 'Day 11',
                    MAX(CASE WHEN td.pat_day_no=12 THEN format(td.pat_day_hrs,'HH:mm') END)  AS 'Day 12',
                    MAX(CASE WHEN td.pat_day_no=13 THEN format(td.pat_day_hrs,'HH:mm') END)  AS 'Day 13',
                    MAX(CASE WHEN td.pat_day_no=14 THEN format(td.pat_day_hrs,'HH:mm') END)  AS 'Day 14'
FROM                trentadm.tpat_nm tn
JOIN trentadm.tpat_det td
    ON td.pat_id=tn.pat_id
GROUP BY tn.pat_nm, tn.pat_id
ORDER BY tn.pat_nm

【讨论】:

  • 有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2015-08-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多